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 ...
随机推荐
- Vuejs搜索下拉框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SGU 114. Telecasting station 三分or找中位数
题目链接点这儿 一開始想都没想...直接上了三分...结果...sample的答案不一样...可是过了...然后又看了看. . . 发现这不就是高中或者初中出过的求中位数的题么. . .直接找到这些的 ...
- 在FPGA中使用for循环一定浪费资源吗?
渐渐地,发现自己已经习惯于发现细节,喜欢打破常规,真的非常喜欢这种feel. 相信很多人在书上或者博文上都有提出“在FPGA中使用for语句是很占用资源的”的观点,特权同学也不例外.那么,这种观点正确 ...
- kafka传数据到Flink存储到mysql之Flink使用SQL语句聚合数据流(设置时间窗口,EventTime)
网上没什么资料,就分享下:) 简单模式:kafka传数据到Flink存储到mysql 可以参考网站: 利用Flink stream从kafka中写数据到mysql maven依赖情况: <pro ...
- AngularJS 初始化加载流程
一.AngularJS 初始化加载流程 1.浏览器载入HTML,然后把它解析成DOM.2.浏览器载入angular.js脚本.3.AngularJS等到DOMContentLoaded事件触发.4.A ...
- LeetCode: Word Search 解题报告
Word SearchGiven a 2D board and a word, find if the word exists in the grid. The word can be constru ...
- Frosh Week
Problem Description During Frosh Week, students play various fun games to get to know each other and ...
- POJ1579:Function Run Fun
Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c ...
- 在腾讯开发 QQ IM 的工作体验是怎样的?
转载 http://blog.csdn.net/kobejayandy/article/details/8685271 目录 一.引言 二.个人网站 三.Oracle/支付宝/旺旺 四.淘宝技术发展( ...
- JavaScript高级 面向对象(4)--值类型和引用类型
说明(2017.3.30): 1. 变量只存数据本身就是值类型,如var a = 123, var a = "123"; 变量存的是一个引用,数据存在别的地方,就是引用类型,如数 ...