Ответ
Чтобы перегрузить постфиксный инкремент (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;
}
Ключевые отличия от префиксного инкремента:
- Сигнатура:
T operator++(int)vsT& operator++(). - Семантика: Возвращает значение до изменения.
- Эффективность: Постфиксный инкремент обычно менее эффективен из-за необходимости создания и возврата временного объекта. Поэтому в циклах
forпредпочтительнее использовать префиксную форму (++i).