ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目22 単独のopの代わりにop=を使うことを考える

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 More Effective C++ (AddisonーWesley professional co)

  • 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/06/29
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 129回
  • この商品を含むブログ (43件) を見る

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

以下のコードが書けるなら

x = x + y;  x = x - y;

次のコードも書けると思うだろう。

x += y;
x -= y;

しかし、ユーザ定義型なら、等しい結果になる保証はない。
自分でそうなるように実装しなければならない。

+と+=が同じ動作になるようにするには、+=を使って+を実装するとよい。

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

// operator+=を使ってoperator+を実装する。
// (operator+=はどこかで0から作る。)
const Rational operator+(const Rational& a, const Rational& b) {
  return Rational(a) += b;
}

代入演算子、単独演算子には以下のような特徴がある。

  • 代入演算子は、単独演算子より効率がよい。
    単独演算子は一般にオブジェクトを返すためにテンポラリオブジェクトの生成と破棄が必要になる。
  • 代入演算子と単独演算子の両方を用意しておくことで、クラスの利用者が効率か便利さかを選択できる。
Rational a, b, c, d, result;
...
result = a + b + c + d;  // おそらく3つのテンポラリオブジェクトを作る。
以下のようにコーディングすることも選べる。
result = a;   // テンポラリ不要
result += b;  // テンポラリ不要
result += c;  // テンポラリ不要
result += d;  // テンポラリ不要
まとめ

一般に代入演算子は単独演算子より効率的。
ライブラリを設計するときは両方を提供するべきで、性能が問われる場合は単独演算子の代わりに代入演算子を使う。