考虑下面的类:
class Rational{
public:
....
Rational& operator +=(const Rational& rhs);
Rational& operator -=(const Rational& lhs);
};
Rational& operator +=(const Rational& rhs,const Rational& lhs)
{
return Rational(lhs) += rhs;
}
这个例子的好处就是维护的时候更加方便,只要修改op=(复合形式)就可以了。
主要的优点有两个:
1.可以提高效率,op= 不需要产生临时对象,减少了临时对象析构跟构造的开销。op=直接返回的是前面已经构造好的对象。
2.可以为客户提供两种形式,客户可以自行在效率与便利之间取舍。
下面再看一个例子:
template<class T>
const T operator+(const T& lhs,const T& rhs)
{return T(lhs) += rhs;}
template<class T>
const T operator+(const T& lhs,const T& rhs)
{
T result(lhs);
return result += rhs;
}
这两个函数第一个函数比较难以理解,c++会先调用拷贝构造函数构造一个临时对象,然后用临时对象进行加法,第二个函数更加
易懂。
但是,第一个函数,编译器可以进行返回值优化,第二个不行,这也就是说第一种可以提高效率。
而且,一个匿名对象比实际对象更容易消除。
综上:如果你设计程序库,则你可以两者兼有,若你是应用软件开发者则应该使用复合形式的版本。