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 ...
随机推荐
- Model实例化类属性与值使用反射拼接成SQL语句
public string GetInsertSqlByModel(Object o) { StringBuilder sbStart = new StringBuilder(); StringBui ...
- Vuejs搜索下拉框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [na]小区网络-pppoe拨号认证原理及部署(panabit来管理)
以前搞网络时候,对小区宽带adsl上网(后ie中的pppoe拨号config)+对一坨人限速的系统(panabit)比较感兴趣,挺神秘. 以前写的,有些纰漏,抽时间我会陆陆续续补充下. PPPOE认证 ...
- apache配置,禁止指定后缀访问
每天都有人来服务器上扫描点什么,想下载点数据库或者什么的 服务器是java的,没有asp或者mdb这样的访问 用一下配置,可以禁止asp或者mdb访问,也可以加上zip和rar禁止 <Direc ...
- graal
https://github.com/graalvm/graal-core/blob/master/docs/Publications.md http://stefan-marr.de/downloa ...
- 递归查询SQL语句
USE [DB] GO /****** Object: View [dbo].[v_menus] Script Date: 02/24/2014 15:55:45 ******/ SET ANSI_N ...
- 【Verilog】verilog实现奇数次分频
实现占空比为50%的N倍奇数分频:首先进行上升沿触发进行模N计数,计数到某一个值时进行输出时钟翻转,然后经过(N-1)/2再次进行翻转得到一个占空比非50%的奇数n分频时钟.再者 同时进行下降沿触发的 ...
- MySQL的使用笔记
@Reference Manual (以下简称REF-M) 在官网,选择MySQL Server,选择Documentation,就可以下载了,建议下载PDF 注意版本要对应 很重要,需要的时候就go ...
- 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼【转】
摘要: 这篇文章给大家带来<五大主流浏览器 HTML5 和 CSS3 兼容性大比拼>,让我们一起来看看2013年的浏览器现状.浏览器厂商之间的竞争促使各大浏览器对 HTML5 和 CSS3 ...
- hdu4366 Successor
好题. 可是感觉题目描写叙述不是非常清楚 这题仅仅是询问开除某人后,他的下属中谁会替代他的位置.不会更新这个位置 要求一个子树中忠诚度最高的人. 能够想到dfs树.保留时间戳.每一个节点便表示一个 ...