条款21:必须返回对象时,别忘想返回其

举世誉之而不加劝,举世非之而不加沮
虽然值传递存在效率等方面的问题,但是不能够一味地追求引用传递从而犯下一个错误,:开始传递一些引用不存在的对象。
所谓的引用只是个名称,代表某一个既有的对象。任何时候看见一个引用声明式,都应该立刻问自己,他的另一个名称是什么?因为他一定是某一物的另一个名称。所以为了返回其引用,必须创造这个对象。
创造对象的方法有以下两种:

  • 在stack空间
  • 在heap空间

如果定义一个局部变量,就是在栈空间创建对象。

//计算两个分数相乘
const Ration& operator*const Ration& lhs,const Ration& rhs)
{
   	Rational result(lhs.n * rhs.n,lns.d * rhs.d);
   	return result;
}

错误1:目标是避免构造函数,但是result却像任何对象一样由构造函数构造起来
错误2:返回的是引用指向的result,但是,result是一个local对象,在函数退出之前就销毁了。
堆空间上的写法也不可行。
一个“必须返回新对象”的函数的正确写法是:就让那个函数返回一个新对象呗,以上代码可以写如下:

 inline const Ration operator*const Ration& lhs,const Ration& rhs)
 {
		return Rational(lhs.n * rhs.n,lns.d * rhs.d);
 }
  • 请记住
  • 绝不要返回pointer或者reference指向一个local stack对象,或者返回reference指向一个heap-allocated对象,或者返回pointer或引用指向一个local static对象而有可能同时需要多个这样的对象。条款4已经为“在单线程环境中合理返回reference指向一个local static对象”提供了一份设计实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值