22項 単独のopの代わりにop=を使うことを考える

単独のopの代わりにop=を使うことを考える



x = x + y;のように書けるなら、x += y;と書けるようにすべきです。
operator+とoperator+=を別々に定義するのは無駄なので、operator+=でoperator+を定義します。

class Rational
{
public:
    Rational &operator +=(const Rational &rhs);
    ...
};


const Rational &operator +(const Rational &lhs, const Rational &rhs)
{
	return Rational(lhs) += rhs;
}

このように書くと、operator+=だけを保守すれば良くなります。
operator+=は一時オブジェクトを作成しないので、x = x + y;のように書くよりも効率的です。
operator+は、名前なしオブジェクトを返しているので、コンパイラが戻り値を最適化できます。



もしすべての単独演算子を大域としてもよいなら、テンプレートを作成できます。

template<class T>
const T &operator +(const T &lhs, const T &rhs)
{
	return T(lhs) += rhs;
}