C++中函数的返回值

 

原文

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值