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对象而有可能同时需要多个这样的对象。
上一篇: MySQL必知必会
推荐阅读
-
条款21:必须返回对象时,别勉强返回其reference
-
Effective C++条款21:必须返回对象时,别妄想返回其reference
-
条款21(二):必须返回对象时,别妄想返回其reference
-
条款21(一):必须返回对象时,别妄想返回其reference
-
条款21:必须返回对象时,别妄想返回其reference——120
-
Effective C++条款21:必须返回对象时,别妄想返回其引用
-
条款21:必须返回对象时,别妄想返回其reference
-
读书笔记《Effective C++》条款21:必须返回对象时,别妄想返回其reference
-
Effective C++ 详解条款21:必须返回对象时,别返回其reference
-
读书笔记《Effective c++》 条款21 必须返回对象时,别妄想返回其reference