c++函数返回值与引用
对于函数的返回值,看似简单,但并非如此,比如:
int func(int a);该函数会返回一个int型,如果进行一个调用int result=func(3);会发生什么情况?
首先,func将返回值复制到一个匿名临时变量中,在这里假设该临时变量为anony(其实是没有名字的,这里方便阐述);然后,再将anony的值复制到result,可以看出,这里是进行了两次复制的。而并非一次复制。
对于返回引用的函数:
int & func(int &a);假设该函数传入一个int的引用,然后再func中修改它,再返回其引用,如果调用int reslut=func(b);会发生如下情况:
返回的是b的引用,因此相当于直接将b的值复制给了result。这里就只有一次复制(少了临时变量的复制,当然也创建了一个临时变量,只是该临时变量是b的一个引用)。
需要特别注意的是,按很多人的理解,这里返回的是一个引用,因此result就是b的引用,其实并非如此,这里返回引用只是减少了一次临时变量值的复制。如果真的要让result能够引用b,可以这样做:int &result = func(b);
注:返回普通变量的引用看不出效率的差异,但是返回比较大的类或者结构体的时候效率差异比较明显。
那如果是这样申明函数int func(int a);注意,这里返回的不是引用。然后int &result=func(a);会发生什么情况呢?
如果是这样,编译器将报错:不能用一个临时变量来初始化一个非常量的引用变量。
要消除这种报错,可以这样写const int &result=func(a);这样虽然返回的不是引用,但是由于最后赋给的是一个引用变量,因此在返回过程中也只有一次复制过程。但是这样的result是不能修改其引用的内容的。
还有一种看似更为诡异但却十分合理的情况:
int &func (int &a);同样假设该函数传入一个int的引用,在func中修改它,然后返回其引用。然后这样调用func(b)=3;这样的后果是,传入的b的值变为3。原因是func返回了一个b的引用,然后再将该引用赋为3,因此b的值也变成了3。
如果要禁止这种情况的发送,可以这样声明函数:const int &func(int &a);这样返回的是一个const引用,它不允许使用该引用修改其指向的值。因此如果有func(b)=3这样的调用,将通不过编译。
c++函数返回值与引用相关推荐
- 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)
2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...
- 14. 函数返回值为引用?
函数返回值可以是引用吗? 当然可以,只是在函数返回引用的时候需要注意几点.以下给出讨论! 函数在返回值的时候,会产生一个临时变量作为函数返回值的副本:而函数在返回引用的时候,不会产生副本!那么既然是引 ...
- 变量的引用-函数返回值传递引用
def test(num):print("在函数内部 %d 对应的内存地址是 %d" % (num, id(num)))# 1> 定义一个字符串变量result = &quo ...
- 函数返回值是否使用引用类型的问题:理解引用、返回值
在<对象更有用的玻璃罩--常引用>一文中,介绍了对象作为函数的参数时,推荐使用引用的形式.并且,如果实际参数的值不允许改变时,声明为常引用更佳. 在<第8周-任务1-方案3-复数类中 ...
- C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)
引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...
- python函数的返回值是返回引用吗_python-函数(上):函数返回值、函数调用、前向引用...
编程方法: 1.面向对象:类--class 2.面向过程:过程--def 3.函数式编程:函数--def #python中函数#函数的定义#打印一个佛祖镇楼 -> 一个功能点的解释 defpri ...
- “引用作为函数参数”与 “引用作为函数返回值”
一.引用作为函数参数 作为函数参数时引用有两种原因: 1.在函数内部会对此参数进行修改:2.提高函数调用和运行效率. 关于第一点,都知道C++里提到函数就会提到形参和实参.如果函数的参数实质就是形参, ...
- C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析
右值引用保存临时变量(函数返回值)的问题 :临时变量是右值 1.普通变量接收函数返回值: 2.右值引用变量接收函数返回值: 3.用const int& 和右值引用是一样的效果,只是const ...
- c++函数返回值是一个引用
函数返回值是一个引用的情况: 1.值是如何被返回的: 返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果. 如果函数返回引用,则该引用仅是它所引对象的一个别名. 2.不能返回局部对象的引 ...
最新文章
- dataTables常用参数
- xpath的数据和节点类型以及XPath中节点匹配的基本方法
- Could not load file or assembly 'System.Web.Extensions, Version=3.5.0.0
- mysql gbk字符集_Mysql字符集知识总结
- CF #737(div2)B. Moamen and k-subarrays 贪心
- Java后端架构开荒实战(一)——基础设施
- [Objective-c 基础 - 2.1] 封装
- C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6
- java 双因素认证(2FA)TOTP demo
- SSM实现的在线挂号预约管理系统源码
- C语言——指针篇(三)数组的下标引用和指针访问
- 在传统以太网中,为什么要有最小帧长度和最大帧长度的限制
- 绑定事件和解绑事件的方法
- 惠普z800工作站bios设置_惠普台式机装win10系统及bios设置(uefi+gpt)
- SPSS实现两独立样本非参数检验
- ios中常用英语单词汇总
- 国际象棋渲染测试软件,国际象棋与Cinebench渲染
- 想要买房的人究竟有多可悲?! --水木周平
- 青山绿水 峡谷奇观---野三坡之行(转)
- 十天教会你做“刀塔传奇”
热门文章
- python pandas读取csv_Python3 pandas怎么读取csv文件的第一行的
- php html实例代码,PHP生成HTML静态页面实例代码
- win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)
- 深入理解JVM(5)——虚拟机类加载机制
- Java开发的几个注意点
- Java程序员从笨鸟到菜鸟全部博客目录
- 海明嵌入Hamming Embedding生成Binary Signature之matlab程序代码
- 别为了学编程而学编程
- 普林斯顿微积分读本:第 2 章 三角学回顾
- 鸟哥的Linux私房菜(基础篇)- 第六章、Linux 的文件权限与目录配置