++ を後置より前置で使う理由

こないだ @rayfillさんに教えてもらったので。

そもそも前置と後置はどう違う

前置はインクリメントした後の状態を返す、後置はインクリメントする前の状態を返す。

int a = 3, b = 3;
cout << ++a  // 4
     << b++  // 3
     << endl;

後置は変更前の値を保持する必要がある

なんかのクラスで後置の ++ を定義するとこんな風になる。

// int のダミー引数を受け取るようにすると後置の ++ をオーバーロード
MyClass MyClass::operator++ (int) {
   MyClass before = *this; //変更前の値を保存
   ... //自分をインクリメント
   return before; //変更前の値を返す
}

コピーコンストラクタが動く

   MyClass before = *this;

で *this と同じ内容の新しいインスタンスを作る。やってることは新しいインスタンスを作って、元のインスタンスの各メンバを新しいインスタンスのメンバに突っ込む、ようなこと。

後置だと前置と比べてこの処理が追加で必要になるんで、必要がない限り前置で済ます方がエコロジー。