iがクラスオブジェクトの場合はi++より++iが効率良いですが、無条件にi++より++iが良いみたく言われていると聞いたのは初耳です。
うっかりミスを防ぐために常に++iを使うのが良いふうに言われるのが誤って伝わったのでしょうか。
V30 さんが書きました:そもそも operator++ の前置・後置は、評価前・評価後のどっちに
インクリメントするかのお話なので、for文の ++ みたいに評価され
ない場合は、単にインクリメントするだけみたいだ。
どっちにインクリメントするかではなくて、式(の評価)として
前置インクリメント式は、インクリメントしたあとの値
後置インクリメント式は、インクリメントするまえの値
になるというのが肝ですね。
後置インクリメントの演算子オーバーライドでは、インクリメントするまえの値を返すためにバックアップを作る必要があるので、オブジェクトの生成コストがかかります。
あと提示されたコードの問題点として、Cintクラスのインクリメント演算子のオーバーライドでCintを返さないと、インクリメント式の結果を利用する場合に不都合があります。
以下のコードを見ていただいたら前置より後置のほうにコストがかかるということが一目瞭然かと思います。
► スポイラーを表示
CODE:
int main()
{
int c = 0;
for (int i = 0; i < 2; ++i) { int d = ++c; }
for (int i = 0; i < 2; i++) { int d = c++; }
class Cint
{
int m_dat;
public:
Cint(const int &value = 0) : m_dat(value) {}
//単項前置++
Cint& operator++()
{
m_dat += 1;
return *this;
}
//単項後置++
Cint operator++(int)
{
Cint retval = *this; // インクリメントする前にバックアップ
++*this; // 前置インクリメント
return retval; // インクリメントする前のバックアップを返す
}
//二項比較<
bool operator<(const int &right) const
{
return m_dat < right;
}
};
for (Cint i = 0; i < 2; ++i) { int d = ++c; }
for (Cint i = 0; i < 2; i++) { int d = c++; }
return 0;
}