函数返回值:引用类型和非引用类型

来源:互联网 发布:linux cat sed 编辑:程序博客网 时间:2024/04/26 08:48

        引用的概念是C++中的,C中不存在引用。


问题1:返回引用类型和非引用类型的区别。

        返回非引用类型:函数的返回值用于初始化在调用函数时创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。

        返回引用类型:当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。所以,其效率更高。


问题2:什么时候返回引用是正确的?而什么时候返回const引用是正确的? 

        返回指向函数调用前就已经存在的对象的引用是正确的。当不希望返回的对象被修改时,返回const引用是正确的。


问题3:什么情况下返回引用才是正确的?*********************请直接忽略问题3,这次回来看后,发现观点欠论据*********************

        返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。比如:

int& abc(int a, int b, int c, int& result){ result = a + b + c;   return result;}
        或者:

int& abc(int a, int b, int c, int *result){  *result = a + b + c;   return *result;}
       这种形式是错误的:(设计思想错误,can compile and run)
int& abc(int a, int b, int c){   return a + b + c;}

注意4:

  • 返回的引用类型是左值。
  • 千万不要返回局部对象的引用!千万不要返回指向局部对象的指针!函数执行完毕时,将释放分配给局部对象的存储空间。此时对局部对象的引用就会指向不确定的内存!返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。


关于临时对象5:返回非引用类型,存在临时对象这个概念。

  • 函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。
  • 在求解表达式的时候,如果需要一个地方存储其运算结果,编译器会创建一个没命名的对象,这就是临时对象。C++程序员通常用temporary这个术语来代替temporary object。用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。
  • 当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。


题外话6:

      main函数允许没有返回值就可结束,编译器会自动为其默认返回0。将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。


代码分析7:(注意看注释)

#include <iostream>using namespace std;int val(){    int i = 1 ;    return i ;}int& ref(){   int j = 3 ;   int &i = j ;  // comment it will also compile.   return j ;  // 不能返回局部对象的引用,可以将int j = 3 ;放在全局作用域。               // 但是编译器不会报错,只是设计思想有问题,请注意main函数中Attention 1和Attention 2的结果。}int main(){    int  vv = val();    //Sconst int& rv = val();  // 编译器报错,error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'                      // const int& rv = val(); can compile    int  vr = ref() ;  // Attention 1,编译器不会报错。    int& rr = ref() ;  // Attention 2    cout << vv << endl ;    //cout << rv << endl ;    cout << vr << endl ;    cout << rr << endl ;    return 0;}
运行结果1:


运行结果2:




参考博文:http://blog.csdn.net/keyouan2008/article/details/5741917

                    http://chinaxxren.iteye.com/blog/1547449

相关博文:关于C++引用的分析


0 0
原创粉丝点击