码迷,mamicode.com
首页 > 其他好文 > 详细

return

时间:2020-06-22 19:23:50      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:names   接收   c++   字符   exit   产生   变量的存储   临时对象   初始化   

  • 一般情况下,返回类型是 void 的函数使用 return 语句是为了引起函数的强制结束,这种 return 的用法类似于循环结构中的 break 语句(第 6.10 节)的作用
  • 1 //cstdlib 头文件定义了两个预处理变量,分别用于表示程序运行成功和失败:
    2 #include <cstdlib>
    3 int main()
    4 {
    5 if (some_failure)
    6 return EXIT_FAILURE;
    7 else
    8 return EXIT_SUCCESS;
    9 }
  • 函数的返回值用于初始化调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是临时对象。 在英语中, C++ 程序员通常用 temporary 这个术语来代替 temporary object
  • 1 // return plural version of word if ctr isn‘t 1
    2 string make_plural(size_t ctr, const string &word,
    3 const string &ending)
    4 {
    5 return (ctr == 1) ? word : word + ending;
    6 }
    /*我们可以使用这样的函数来输出单词的单数或复数形式。这个函数要么返回其形参 word 的副本
    要么返回一个未命名的临时string 对象,这个临时对象是由字符串 word 和 ending 的相加而产生的
    这两种情况下,return 都在调用该函数的地方复制了返回的 string 对象。
    */
  • 当返回值是引用类型时,调用函数返回结果时返回的时候没有进行复制
    1 // find longer of two strings
    2 const string &shorterString(const string &s1, const string &s2)
    3 {
    4 return s1.size() < s2.size() ? s1 : s2;
    5 }

     

  • 千万不能返回局部变量的引用,当函数执行完后,局部变量的存储空间会被释放,对局部对象的引用就会指向不确定的内存
     1 #include<iostream>
     2 using namespace std;
     3 int& func()
     4 {
     5     int a = 55;
     6     cout << "函数里面a的地址:" << &a<<endl;
     7     return a;
     8 }
     9 int main()
    10 {
    11     int c = func();
    12     cout << "函数返回值地址:"<< &c <<endl;
    13     cout << c;
    14     return 0;
    15 }

    //以上情况c的值为55,地址变了
    可见这样接收返回的局部变量的引用可以把它的值保留下来
    技术图片

  •  

     1 #include <iostream>
     2 using namespace std;
     3 int &c()
     4 {
     5     int a=5;
     6     cout <<&a <<endl;
     7     return a;
     8 }
     9 int main()
    10 {
    11     int *b;
    12     b = &c();
    13     cout << b << endl;
    14     cout << *b << endl;//如果是cout << b << *b << endl; 又会发现*b==5?
    15     return 0;
    16 }

    技术图片

    内存被释放

  •  不要返回局部变量的指针

     1 #include <iostream>
     2 using namespace std;
     3 int *c()
     4 {
     5     int a=5;
     6     cout <<&a <<endl;
     7     return &a;
     8 }
     9 int main()
    10 {
    11     int *b = c();
    12     cout << *b <<  endl << b << endl;
    13     cout << *b << endl;
    14     return 0;
    15 }

    技术图片

    第一次输出的时候*b是函数局部变量原来的值
    技术图片

    如果第一次输出地址,后面输出*b是位置的

     技术图片


     在输出前先输出一个无关的变量(a),后面又指向未知了,所以说出现上面的情况
    应该是因为函数执行完后输出的返回值的时候局部变量还没有来得及释放
    技术图片

    尝试用一个变量将还没有释放的内存里的值保存下来
    技术图片

  •  

     1 #include <iostream>
     2 using namespace std;
     3 int &get(int *arry, int index) { return
     4 arry[index]; }
     5 int main() {
     6     int ia[10];
     7     for (int i = 0; i != 10; ++i)
     8     {
     9         get(ia, i) = 2;
    10         cout << ia[i];
    11     }
    12 }

    技术图片

return

标签:names   接收   c++   字符   exit   产生   变量的存储   临时对象   初始化   

原文地址:https://www.cnblogs.com/2020R/p/13178168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!