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; }