Effective C++条款21:必须返回对象时,别妄想返回其reference
当我们在返回对象的时候,如果return by value就会造成析构函数和构造函数的构建成本。
返回reference时,会有以下几个需要注意的问题。
1、在这里既是一开始就返回引用,也会创建出一个对象,因为一开始就期待它存在一个Rational对象在调用operator*前就存在,所以此时调用reference还是会有构造和析构的成本
Rational a(1,2);
Rational b(3,5);
Rational c = a*b;
2、假如我们使用如下代码的话,那么使用return by reference就变得没有意义。因为这里还是使用了构造和析构函数,同时,更加严重的时,result是一个local对象,在函数退出时,这个对象就被销毁了。所以这个返回的reference指向的是一个被销毁的对象。
const Rational& operator* (const Rational& lhs,const Rational& rhs)
{
Rational result(lhs.n * rhs.n,lhs.d * rhs.d);
return result;
}
3、使用堆进行构建对象,这样做的一个问题在于,new出了对象,但是应该发现的是,我们无处对其进行delete
const Rational& operator* (const Rational& lhs,const Rational& rhs)
{
Rational* result = new Rational(lsh.n *rsh.n, lhs.d * rhs.d);
return *result;
}
正确做法:
inline const Rational operator *(const Rational* lhs,const Rational& rhs)
{
return Rational(lhs.n*rhs.n,lhs.d*lhs.d);
}
要记住的点:
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而有可能同时需要多个这样的对象。
posted on 2022-08-13 16:15 DylanYeung 阅读(27) 评论(0) 编辑 收藏 举报