欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Effective C++条款21:必须返回对象时,别妄想返回其reference

程序员文章站 2022-07-12 17:51:22
...

当我们在返回对象的时候,如果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对象而有可能同时需要多个这样的对象。

相关标签: C++ Effective