天天看点

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

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

c++面向对象高效编程(第2版)

要尽可能避免从函数返回引用。原因如下:

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

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

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

对象foo必须存在,甚至还应保证从函数返回后它仍然存在。

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

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

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

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

1实际上,当无法创建引用时,语言(实际上是编译器)自身会抛出异常(参见后续章节中关于rtti——运行时类型识别的相关内容)。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

继续阅读