dylanin1999

导航

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编辑  收藏  举报