1、方法返回对象,会导致临时对象的产生,这降低了效率,const Rational operator* (const Rational& lhs,Rational& rhs)。有没有什么解决办法呢?
2、试图返回引用,方法内的局部对象,在方法执行完后销毁,这个引用指向垃圾。不可行。
3、试图返回指针,这导致奇怪的语法Rational c = *(a*b); 并且要求客户执行delete,这不合理。就算客户正确执行delete,有些情况,方法返回值没有暴露指针,客户无法执行delete,比如:Rational d = *(a*b*c); 不可行。
4、因此,必须返回对象。那该怎么办呢?
编译器会进行优化,避免临时对象的产生。但是,编译器需要你的协助。 也就是使用constructor arguments取代对象。如下:
const Rational operator*(const Rational& lhs,const Rational& rhs)
{
return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator()*rhs.denominator());
}
这种方式有个专属名称:返回值优化RVO(Return Value Optimization)。
5、使用上面的constructor arguments,考虑Rational c = a*b; 编译器优化的结果是:消除operator*方法内的局部对象,同时消除方法返回值的临时对象,使用return表达式直接构造c。优化结果很好。