一旦程序员领悟了pass-by-value(传值)的效率牵连层面,往往变成十字军战士,一心一意根除pass-by-value带来的种种邪恶。在坚定追求pass-by-reference的纯度中,他们一定会犯下一个致命错误:开始传递一些references指向其实并不存在的对象,这可不是件好事。
考虑一个用以表现有理数的class,内含一个函数用来计算两个有理数的乘积:
class Rational{
public:
Rational (int numerator=0,
int denominator=1);
private:
int n,d;
friend const Rational operator* (const Rational & lhs,const Rational & rhs);
}
这个版本的operator* 系以by value方式返回其计算结果(一个对象),如果你完全不担心该对象的构造和析构成本,你其实明显逃避你的专业责任,若非必要,没有人会想要
为这样的对象付出太对代价,问题是需要付出任何代价吗?
如果改为reference,就不需要付出代价。但是记住,所谓reference只是一个名称,代表某个既有对象。任何时候看到一个reference声明式,你都应该立刻问自己,它的另外一个名称是什么?因为它一定是某物的另一个名称。
以上述operator* 为例,如果它返回一个reference,后者一定指向既有的Rational对象,内含两个Rational对象的乘积。