Как перегрузить постфиксный инкремент

«Как перегрузить постфиксный инкремент» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы перегрузить постфиксный инкремент (operator++(int)), нужно объявить метод с фиктивным параметром типа int. Этот параметр не используется, он служит только для отличия сигнатуры от префиксного инкремента (operator++()). Метод должен вернуть копию объекта до увеличения его значения.

#include <iostream>

class Integer {
private:
    int value;
public:
    Integer(int v) : value(v) {}

    // Префиксный инкремент: ++obj
    Integer& operator++() {
        ++value;
        return *this; // Возвращаем ссылку на измененный объект
    }

    // Постфиксный инкремент: obj++
    Integer operator++(int) {
        Integer temp = *this; // Сохраняем текущее состояние
        ++value;              // Инкрементируем внутреннее значение
        return temp;          // Возвращаем старое состояние
    }

    int getValue() const { return value; }
};

int main() {
    Integer a(5);
    Integer b = a++; // b = 5 (старое значение), a становится 6
    Integer c = ++a; // a становится 7, c = 7 (новое значение)

    std::cout << b.getValue() << std::endl; // 5
    std::cout << c.getValue() << std::endl; // 7
    return 0;
}

Ключевые отличия от префиксного инкремента:

  1. Сигнатура: T operator++(int) vs T& operator++().
  2. Семантика: Возвращает значение до изменения.
  3. Эффективность: Постфиксный инкремент обычно менее эффективен из-за необходимости создания и возврата временного объекта. Поэтому в циклах for предпочтительнее использовать префиксную форму (++i).