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

任何时候看到一个reference声明式,你都应该立刻问自己,它的另一个名称是什么?因为它一定是某物的另一个名称。
当我们将一个局部对象的引用作为函数返回值时,我们不可能期望这个对象在调用函数时已经存在,如果我们希望返回一个reference指向某个数据,它必须自己创建那个对象。
函数创建新对象的途径有二:在stack或heap空间创建它。如果定义一个local变量,也就是在stack空间创建,当函数退出时,这个local对象就被销毁了,这时你的reference将指向undefined的对象!(如果函数返回指针指向一个local对象也如此
于是,我们考虑在heap内构造一个对象,并返回reference指向它。现在又有了另一个问题,谁该对着被你new出来的对象实施delete?
或许还有另一个方法,让函数返回的reference指向一个被定义于函数内部的static对象。然而如果对返回的对象用了==操作,==两边的对象返回的值将是一样的!因为是对同一个成员变量的引用!也许还能想出static array,数组的大小选择的最优化是一个问题,如何将需要的值放入array也是一个问题..
因此,一个“必须返回新对象”的函数的正确写法是:就让那个函数返回一个新对象吧!
当然,这样做需要承受返回值的构造成本和析构成本,然而长远来看那只是为了获得正确的行为而付出的一个小小代价。即使账单很恐怖,允许编译器实行者施行最优化,用以改善产出码的效率却不改变其可观察行为。因此就让编译器厂商为“尽可能降低成本”鞠躬尽瘁吧!

猜你喜欢

转载自blog.csdn.net/unirrrrr/article/details/81255279