本文共 971 字,大约阅读时间需要 3 分钟。
本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第3章,第3.16节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。
C++面向对象高效编程(第2版)
要尽可能避免从函数返回引用。原因如下:(1)能从函数安全返回对某对象的引用(假定为foo)时,该函数不能创建对象foo。否则,谁对新创建对象的存储区负责?因为它不能是局部对象,这意味着在调用foo()之前,
左值(L-value)语义的含义
左值可用在赋值操作符的左则(LHS)。例如,a = b
表示a将被修改,而且它是一个左值。许多C++(和C)的操作符都要求正确地操作左值。所有其他操作符与赋值号结合的操作符,例如,+=
、/=
等都是左值操作符。写a *= b
和a = a * b
一样,对象a都将被修改。因此,a必须为左值。如果a是const,那么a*= b
将不会通过编译,因为在这种情况下,a不能被修改(它不是一个左值)。在该例中,b是右值,可以从右值中读取数据。任何能作为左值使用的对象(或基本类型)都不能是const。操作符(=
、+=
、-=
、*=
、/=
等)都有左值语义。也就是说,左侧的对象将被修改,因此它必须为左值。
(2)函数(该函数返回对某对象的引用)如何表明被引用的对象创建失败?没有诸如空引用这样的东西,唯一可替代的方案就是抛出(throw)异常1。
有一些非常特殊的情况,需要从函数返回引用(而且要安全返回)。
通过现有对象调用某些函数,必须保证对象(调用函数的对象)至少在函数生存期内一直存在。在这种情况下,就可安全地返回对某对象的引用(实际上是this)。这主要用于赋值操作符(operator=)和一些具有左值语义的操作符中(如+=、=等),详见第8章。
hand 如果希望从函数多态返回,唯一的选择就是返回引用或者指针(后面章节将会介绍)。在这种情况下,按值返回不可用。
1实际上,当无法创建引用时,语言(实际上是编译器)自身会抛出异常(参见后续章节中关于RTTI——运行时类型识别的相关内容)。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。