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

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

程序员文章站 2022-03-06 11:57:44
...

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

  • 在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对象”提供了一份设计实例。
相关标签: 读书笔记