原文

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

C++中函数的返回值的更多相关文章

  1. python中函数的返回值

    函数返回值(一) <1>“返回值”介绍 现实生活中的场景: 我给儿子10块钱,让他给我买包烟.这个例子中,10块钱是我给儿子的,就相当于调用函数时传递到参数,让儿子买烟这个事情最终的目标是 ...

  2. C语言中函数的返回值

    规则 除局部变量的内存地址不能作为函数的返回值外,其他类型的局部变量都能作为函数的返回值. 我总结出下面这些规则: int.char等数据类型的局部变量可以作为函数返回值. 在函数中声明的指针可以作为 ...

  3. js 中 函数的返回值问题

    var result=''; function searchByStationName( address ) { // map.clearOverlays();//清空原来的标注 var keywor ...

  4. SpringMvc中函数的返回值是什么?

    返回值可以有很多类型,有String, ModelAndView.ModelAndView类把视图和数据都合并的一起的,但一般用String比较好.

  5. Swift2.0语言教程之函数的返回值与函数类型

    Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有 ...

  6. JavaScript 在函数中使用Ajax获取的值作为函数的返回值

    解决:JavaScript 在函数中使用Ajax获取的值作为函数的返回值,结果无法获取到返回值 原因:ajax默认使用异步方式,要将异步改为同步方式 案例:通过区域ID,获取该区域下所有的学校 var ...

  7. Unix系统中system函数的返回值

    网上关于system函数的返回值说明很多很详细但却不直观,这里搬出apue 3rd Editon中实现system函数的代码来说明其返回值. #include <sys/wait.h> # ...

  8. jQuery中ajax如何返回值到上层函数

    jQuery中ajax如何返回值到上层函数 一.总结 一句话总结: ajax的同步操作即可,设置 async: false, 二.jquery的同步操作 var can_submit=true; $. ...

  9. (转)函数中使用 ajax 异步 同步 返回值错误 主函数显示返回值总是undefined -- ajax使用总结

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAloAAAE0CAIAAAB7LwoKAAAgAElEQVR4nO2dy6sc152A6+/R2mXwSn ...

随机推荐

  1. Vuejs搜索下拉框

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. SGU 114. Telecasting station 三分or找中位数

    题目链接点这儿 一開始想都没想...直接上了三分...结果...sample的答案不一样...可是过了...然后又看了看. . . 发现这不就是高中或者初中出过的求中位数的题么. . .直接找到这些的 ...

  3. 在FPGA中使用for循环一定浪费资源吗?

    渐渐地,发现自己已经习惯于发现细节,喜欢打破常规,真的非常喜欢这种feel. 相信很多人在书上或者博文上都有提出“在FPGA中使用for语句是很占用资源的”的观点,特权同学也不例外.那么,这种观点正确 ...

  4. kafka传数据到Flink存储到mysql之Flink使用SQL语句聚合数据流(设置时间窗口,EventTime)

    网上没什么资料,就分享下:) 简单模式:kafka传数据到Flink存储到mysql 可以参考网站: 利用Flink stream从kafka中写数据到mysql maven依赖情况: <pro ...

  5. AngularJS 初始化加载流程

    一.AngularJS 初始化加载流程 1.浏览器载入HTML,然后把它解析成DOM.2.浏览器载入angular.js脚本.3.AngularJS等到DOMContentLoaded事件触发.4.A ...

  6. LeetCode: Word Search 解题报告

    Word SearchGiven a 2D board and a word, find if the word exists in the grid. The word can be constru ...

  7. Frosh Week

    Problem Description During Frosh Week, students play various fun games to get to know each other and ...

  8. POJ1579:Function Run Fun

    Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c ...

  9. 在腾讯开发 QQ IM 的工作体验是怎样的?

    转载 http://blog.csdn.net/kobejayandy/article/details/8685271 目录 一.引言 二.个人网站 三.Oracle/支付宝/旺旺 四.淘宝技术发展( ...

  10. JavaScript高级 面向对象(4)--值类型和引用类型

    说明(2017.3.30): 1. 变量只存数据本身就是值类型,如var a = 123, var a = "123";  变量存的是一个引用,数据存在别的地方,就是引用类型,如数 ...