原文
[ 函数的返回值用于初始化在调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是 临时对象。temporary object ]
--就是说,当你需要使用函数的返回值时,编译器会创建一个 临时对象。
--只有非引用返回才会创建临时对象!!!
C++中函数的返回值有三种类型:void、非引用、引用。
-- 非引用,返回的是实参对象或者局部对象的副本!
-- 引用,返回的是引用,而非副本。
上面这么说很教科书,需要和实际代码联系起来理解。
问题
怎么验证非引用返回的就是副本?又怎么验证引用返回的就是引用?
在这里不得不说指针是个好东西,完全可以通过输出对象的地址(指针)来判断是否副本。
如下面代码部分,定义了三个函数,分别返回非引用、引用(实参)、引用(局部对象)。
代码
#include <iostream> using namespace std; //返回非引用 int myno(int &v1){ return v1; } //返回引用 int &myno2(int &v1){ return v1; } //返回局部引用 Never ever ever do this int &myno3(int &v1){ int v2=v1; //副本 return v2;//Don't do this } //判断传入的和返回的是否同一个 int main(){ int v1=1; cout<<&v1<<endl; const int &no1 = myno(v1); //为毛必须要const? cout<<&no1<<endl; //和&v1不同,因为返回的是副本 int &no2=myno2(v1); cout<<&no2<<endl; // 和&v1相同 int &no3=myno3(v1); cout<<&no3<<endl;//被释放的内存 cout<<no3<<endl;//无效值 return 0; }
由此可验证,非引用返回的的确是副本,而引用则返回引用。
只是,务必注意,不要返回局部对象的引用!
为什么使用 非引用返回 来赋值时需要const?
原因:不允许非const引用指向需要临时对象(见本文开头部分)的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!
就是说,返回引用时,没有临时对象?
20160617修改:c++11已经去掉了该限制(引用必须const的限制)。
--补充:使用字面值常量初始化引用时,也会创建临时对象,所以也必须const。
参考: