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=;
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 ;
}
由此可验证,非引用返回的的确是副本,而引用则返回引用。
只是,务必注意,不要返回局部对象的引用!
为什么使用 非引用返回 来赋值时需要const?
原因:不允许非const引用指向需要临时对象(见本文开头部分)的对象或值,即,编译器产生临时变量的时候引用必须为const!!!!切记!!
就是说,返回引用时,没有临时对象?
20160617修改:c++11已经去掉了该限制(引用必须const的限制)。
--补充:使用字面值常量初始化引用时,也会创建临时对象,所以也必须const。
参考:
C++中函数的返回值的更多相关文章
- python中函数的返回值
函数返回值(一) <1>“返回值”介绍 现实生活中的场景: 我给儿子10块钱,让他给我买包烟.这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是 ...
- C语言中函数的返回值
规则 除局部变量的内存地址不能作为函数的返回值外,其他类型的局部变量都能作为函数的返回值. 我总结出下面这些规则: int.char等数据类型的局部变量可以作为函数返回值. 在函数中声明的指针可以作为 ...
- js 中 函数的返回值问题
var result=''; function searchByStationName( address ) { // map.clearOverlays();//清空原来的标注 var keywor ...
- SpringMvc中函数的返回值是什么?
返回值可以有很多类型,有String, ModelAndView.ModelAndView类把视图和数据都合并的一起的,但一般用String比较好.
- Swift2.0语言教程之函数的返回值与函数类型
Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...
- JavaScript 在函数中使用Ajax获取的值作为函数的返回值
解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...
- Unix系统中system函数的返回值
网上关于system函数的返回值说明很多很详细但却不直观,这里搬出apue 3rd Editon中实现system函数的代码来说明其返回值. #include <sys/wait.h> # ...
- jQuery中ajax如何返回值到上层函数
jQuery中ajax如何返回值到上层函数 一.总结 一句话总结: ajax的同步操作即可,设置 async: false, 二.jquery的同步操作 var can_submit=true; $. ...
- (转)函数中使用 ajax 异步 同步 返回值错误 主函数显示返回值总是undefined -- ajax使用总结
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAloAAAE0CAIAAAB7LwoKAAAgAElEQVR4nO2dy6sc152A6+/R2mXwSn ...
随机推荐
- 自己定义View学习之12/7(进度条之混合模式)
今天重点内容是我们学习自己定义view里面的混合模式.事实上我们的画布就跟photoshop一样.是个图层关系,一层盖着一层.这样就导致有非常多种覆盖模式,这就是我们今天的主题."混合模式& ...
- C#方法参数--值参数,引用参数,输出参数
值参数: 使用值参数,通过复制实参的值到形参的方式,把数据传递到方法,方法被调用的时候,系统做如下操作: 在栈中为形参分配空间: 复制实参到形参. 注意:一个值参数的实参不一定是变量,它可以是任何能够 ...
- django 数据库获取值
数据库表中的内容如下: models.Step_Type.objects.values()获取model中的符合条件的值, 实际为把表中的所有值都查询出来,如查询结果为:<QuerySet [{ ...
- NodeJS错误处理最佳实践
NodeJS的错误处理让人痛苦,在很长的一段时间里,大量的错误被放任不管.但是要想建立一个健壮的Node.js程序就必须正确的处理这些错误,而且这并不难学.如果你实在没有耐心,那就直接绕过长篇大论跳到 ...
- Spring中三种配置Bean的方式
Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...
- putty的复制和粘贴
putty在终端中的复制--->只要用左键选中即是复制了,千万不要按右键. 在windows下的复制后,在终端粘贴---> 只要右键即可.
- xilinx 官方技术资料
http://china.xilinx.com/support/index.html/content/xilinx/zh/supportNav/ip_documentation.html
- PHP5.5四种序列化性能对照
json_encode,serialize,igbinary,msgpack四种序列化方式,在之前已经有过相关的測试,PHP5.5这方面的測试临时没有,这次測试基于PHP5.5,而且測试用例,http ...
- prequeue receive queue backlog queue
prequeue和backlog和receive 5.6 TCP prequeue http://blog.csdn.net/u011130578/article/details/44814201 t ...
- VS15 Visual Assist X破解
Visual Assist X是一款非常好的Microsoft Visual Studio插件,支持C/C++,C#,ASP,Visual Basic,Java和HTML等语言,Visual Assi ...