条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
本条款听起来很复杂,其实不然。它只是一个很简单的道理,真的,相信我。
先看第一种情况:返回一个局部对象的引用。它的问题在于,局部对象 ----- 顾名思义 ---- 仅仅是局部的。也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的。所谓生命空间,是指它们所在的函数体。当函数返回时,程序的控制离开了这个空间,所以函数内部所有的局部对象被自动销毁。因此,如果返回局部对象的引用,那个局部对象其实已经在函数调用者使用它之前被销毁了。
当想提高程序的效率而使函数的结果通过引用而不是值返回时,这个问题就会出现。下面的例子和条款23中的一样,其目的在于详细说明什么时候该返回引用,什么时候不该:
class Rational { // 一个有理数类
public:
Rational(int numerator = 0, int denominator = 1);
~Rational();
...
private:
int n, d; // 分子和分母
// 注意operator* (不正确地)返回了一个引用
friend const Rational& operator*(const Rational& lhs,
const Rational& rhs);
};
// operator*不正确的实现
inline const Rational& operator*(const Rational& lhs,