对于函数的返回值,看似简单,但并非如此,比如:

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++函数返回值与引用相关推荐

  1. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  2. 14. 函数返回值为引用?

    函数返回值可以是引用吗? 当然可以,只是在函数返回引用的时候需要注意几点.以下给出讨论! 函数在返回值的时候,会产生一个临时变量作为函数返回值的副本:而函数在返回引用的时候,不会产生副本!那么既然是引 ...

  3. 变量的引用-函数返回值传递引用

    def test(num):print("在函数内部 %d 对应的内存地址是 %d" % (num, id(num)))# 1> 定义一个字符串变量result = &quo ...

  4. 函数返回值是否使用引用类型的问题:理解引用、返回值

    在<对象更有用的玻璃罩--常引用>一文中,介绍了对象作为函数的参数时,推荐使用引用的形式.并且,如果实际参数的值不允许改变时,声明为常引用更佳. 在<第8周-任务1-方案3-复数类中 ...

  5. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  6. python函数的返回值是返回引用吗_python-函数(上):函数返回值、函数调用、前向引用...

    编程方法: 1.面向对象:类--class 2.面向过程:过程--def 3.函数式编程:函数--def #python中函数#函数的定义#打印一个佛祖镇楼 -> 一个功能点的解释 defpri ...

  7. “引用作为函数参数”与 “引用作为函数返回值”

    一.引用作为函数参数 作为函数参数时引用有两种原因: 1.在函数内部会对此参数进行修改:2.提高函数调用和运行效率. 关于第一点,都知道C++里提到函数就会提到形参和实参.如果函数的参数实质就是形参, ...

  8. C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析

    右值引用保存临时变量(函数返回值)的问题 :临时变量是右值 1.普通变量接收函数返回值: 2.右值引用变量接收函数返回值: 3.用const int& 和右值引用是一样的效果,只是const ...

  9. c++函数返回值是一个引用

    函数返回值是一个引用的情况: 1.值是如何被返回的: 返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果. 如果函数返回引用,则该引用仅是它所引对象的一个别名. 2.不能返回局部对象的引 ...

最新文章

  1. dataTables常用参数
  2. xpath的数据和节点类型以及XPath中节点匹配的基本方法
  3. Could not load file or assembly 'System.Web.Extensions, Version=3.5.0.0
  4. mysql gbk字符集_Mysql字符集知识总结
  5. CF #737(div2)B. Moamen and k-subarrays 贪心
  6. Java后端架构开荒实战(一)——基础设施
  7. [Objective-c 基础 - 2.1] 封装
  8. C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6
  9. java 双因素认证(2FA)TOTP demo
  10. SSM实现的在线挂号预约管理系统源码
  11. C语言——指针篇(三)数组的下标引用和指针访问
  12. 在传统以太网中,为什么要有最小帧长度和最大帧长度的限制
  13. 绑定事件和解绑事件的方法
  14. 惠普z800工作站bios设置_惠普台式机装win10系统及bios设置(uefi+gpt)
  15. SPSS实现两独立样本非参数检验
  16. ios中常用英语单词汇总
  17. 国际象棋渲染测试软件,国际象棋与Cinebench渲染
  18. 想要买房的人究竟有多可悲?! --水木周平
  19. 青山绿水 峡谷奇观---野三坡之行(转)
  20. 十天教会你做“刀塔传奇”

热门文章

  1. python pandas读取csv_Python3 pandas怎么读取csv文件的第一行的
  2. php html实例代码,PHP生成HTML静态页面实例代码
  3. win10下vs2015编译的程序如何运行在win7等系统(无需安装Redistributable)
  4. 深入理解JVM(5)——虚拟机类加载机制
  5. Java开发的几个注意点
  6. Java程序员从笨鸟到菜鸟全部博客目录
  7. 海明嵌入Hamming Embedding生成Binary Signature之matlab程序代码
  8. 别为了学编程而学编程
  9. 普林斯顿微积分读本:第 2 章 三角学回顾
  10. 鸟哥的Linux私房菜(基础篇)- 第六章、Linux 的文件权限与目录配置