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

本文探讨了C++中返回引用的潜在问题,包括构造和析构的成本、局部对象的销毁以及堆上对象的不当管理。正确做法是避免返回指向局部或堆上未管理的对象的引用或指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值