Namaran

Code daily. Without assist.

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.value2です。これはC/C++の組み込みの++i/i++と同じ「前置は新しい値、後置は古い値」という関係を、演算子オーバーロードでもそのまま踏襲した形です。