本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第3章,第3.16节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。

3.16 从函数中返回引用

C++面向对象高效编程(第2版)
要尽可能避免从函数返回引用。原因如下:

(1)能从函数安全返回对某对象的引用(假定为foo)时,该函数不能创建对象foo。否则,谁对新创建对象的存储区负责?因为它不能是局部对象,这意味着在调用foo()之前,

左值(L-value)语义的含义

左值可用在赋值操作符的左则(LHS)。例如,a = b表示a将被修改,而且它是一个左值。许多C++(和C)的操作符都要求正确地操作左值。所有其他操作符与赋值号结合的操作符,例如,+=/=等都是左值操作符。写a *= ba = a * b一样,对象a都将被修改。因此,a必须为左值。如果a是const,那么a*= b将不会通过编译,因为在这种情况下,a不能被修改(它不是一个左值)。在该例中,b是右值,可以从右值中读取数据。任何能作为左值使用的对象(或基本类型)都不能是const。操作符(=+=-=*=/= 等)都有左值语义。也就是说,左侧的对象将被修改,因此它必须为左值。
对象foo必须存在,甚至还应保证从函数返回后它仍然存在。

(2)函数(该函数返回对某对象的引用)如何表明被引用的对象创建失败?没有诸如空引用这样的东西,唯一可替代的方案就是抛出(throw)异常1。

有一些非常特殊的情况,需要从函数返回引用(而且要安全返回)。

通过现有对象调用某些函数,必须保证对象(调用函数的对象)至少在函数生存期内一直存在。在这种情况下,就可安全地返回对某对象的引用(实际上是this)。这主要用于赋值操作符(operator=)和一些具有左值语义的操作符中(如+=、=等),详见第8章。

hand 如果希望从函数多态返回,唯一的选择就是返回引用或者指针(后面章节将会介绍)。在这种情况下,按值返回不可用。

1实际上,当无法创建引用时,语言(实际上是编译器)自身会抛出异常(参见后续章节中关于RTTI——运行时类型识别的相关内容)。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

《C++面向对象高效编程(第2版)》——3.16 从函数中返回引用相关推荐

  1. 《C++面向对象高效编程(第2版)》——导读

    前言 C++面向对象高效编程(第2版) 面向对象软件开发已逐渐成为开发软件的首选.优秀的面向对象软件开发人员.设计人员.系统架构师对其需求与日俱增.要想成为一名成功的面向对象编程(OOP)人员必须忘却 ...

  2. 《C++面向对象高效编程(第2版)》——3.11 类名、成员函数名、参数类型和文档...

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.11节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  3. 《C++面向对象高效编程(第2版)》——2.29 泛化关系(is-a)

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.29节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  4. 《C++面向对象高效编程(第2版)》——2.20 什么是多线程安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第章,第2.20节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

  5. 《C++面向对象高效编程(第2版)》——2.30 has-a关系的重要性

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.30节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  6. 《C++面向对象高效编程(第2版)》——3.13 采用语义

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.13节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  7. 《C++面向对象高效编程(第2版)》——3.17 编写内存安全类

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.17节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  8. 《C++面向对象高效编程(第2版)》——2.16 识别成员函数的目标对象

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第2章,第2.26节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区 ...

  9. 《C++面向对象高效编程(第2版)》——3.4 赋值操作符

    本节书摘来自异步社区出版社<C++面向对象高效编程(第2版)>一书中的第3章,第3.4节,作者: [美]Kayshav Dattatri,更多章节内容可以访问云栖社区"异步社区& ...

最新文章

  1. 【MySQL】Dockerfile书写简单示例
  2. python中for循环和while循环的区别_python中while循环和for循环的定义和详细的使用方法...
  3. PHP读取数据库表显示到前台
  4. Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址
  5. mysql 查询此时日期_mysql 查询日期
  6. matlab历史指示穿作用,重新学习MATLAB——相见恨晚的重要应用技巧
  7. 毕业多年没稳定的收入...大龄转行做自动化测试,现在已经快年薪30W
  8. 绝对路径与相对路径cd命令的使用
  9. 数据分析第四天--数据抽取、数据合并和数据计算
  10. 计算机蓝屏一直重启,笔记本电脑开机蓝屏不断重启问题的解决方法
  11. 颂钵带给我们是什么感受
  12. 用Python多线程抓取并验证代理
  13. python import失败_解决python有时候import不了当前的包问题
  14. linux如何每30分钟执行指令,CentOS7设置定时任务 每隔30分钟执行一次命令
  15. 世界上最好的加密软件
  16. b站视频详情数据抓取,自动打包并发送到指定邮箱(单个或者群发)
  17. 内存条是不是计算机主机配置,玩吃鸡电脑要什么配置 主要是CPU,显卡和内存条...
  18. 关于DefaultHttpClient的作用已经被弃之后的新方法
  19. java的rest教程,REST接口
  20. Div Scroll Bar (用层模拟滚动条)

热门文章

  1. 一道二叉树的题目--后序遍历+中序遍历确定二叉树
  2. 爬虫从入门到放弃——爬虫的基本原理
  3. P2658 汽车拉力比赛
  4. C#与matlab混合编程
  5. MessageDAL
  6. 【记事】今年的中秋节
  7. C++之第一个程序Hello World,使用IO库输出Hello World
  8. Hadoop开启Kerberos安全模式
  9. MySQL数据库常用命令汇总
  10. Linux shell脚本调试