您的位置:首页 > 编程语言 > C语言/C++

C++中函数的返回值

2016-06-15 14:24 218 查看
原文

[ 函数的返回值用于初始化在调用函数处创建的临时对象。在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是 临时对象。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。

参考:

  C++ const引用详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: