2026-08-27
counter.cpp
#include <iostream>
struct Counter {
int value = 0;
Counter& operator++() { // prefix
++value;
return *this;
}
Counter operator++(int) { // postfix
Counter old = *this;
++value;
return old;
}
};
int main() {
Counter c;
std::cout << (++c).value << " ";
std::cout << (c++).value << " ";
std::cout << c.value << "\n";
}
これは何を出力するでしょうか?
Answer
1 1 2(その後に改行)。前置のoperator++()はvalueをインクリメントしてから*thisへの参照を返すので、(++c).valueはすぐに更新後の値1になります。後置のoperator++(int)はインクリメントする前に自分自身のコピーoldを取っておき、そのコピーを返すので、(c++).valueは更新前の値、つまりまだ1です(c自身はこの時点で2になっています)。最後のc.valueは2です。これはC/C++の組み込みの++i/i++と同じ「前置は新しい値、後置は古い値」という関係を、演算子オーバーロードでもそのまま踏襲した形です。