Глава 16. Перегрузка операций_______________________________397
При написании программ мы можем визуально проверять положение операций ++ и —. Некоторые сложности появляются тогда, когда мы пытаемся перегрузить эти оператор-функции. Общий вид операций инкремент и декремент
Т& operator++(); // где Ts — ссылка на тип объекта
И
Т& operator—0;
соответственно. Тут уже невозможно визуально различить префиксную и постфиксную формы. С этой целью в постфиксную форму искусственно введен беззнаковый целочисленный аргумент, поэтому объявление постфиксной оператор-функции выглядит так:
Т& operator++(int); // постфиксная форма; возвращает ссылку на Т, // а аргумент int остается невостребованным
*
И
Т& operator++(int);
Введение перегруженных операций, как префиксных, так и постфиксных, не вносит изменений в ваш код. Целочисленный аргумент никогда не используется, он служит только для того, чтобы компилятор мог различить объявления этих функций в классе.
Было бы неразумным перегружать постфиксную операцию без префиксной и наоборот. Рассмотрим пример класса х с парой перегруженных инкрементов:
class X
(
public:
// ...
Xs operator++(); // префиксный инкремент
Х& operator++(int); // постфиксный инкремент,
{ return operator++О; } // реализован на основе префиксного
t;
Достаточно распространено определение одной операции из пары через вторую. Когда в классе х вызывается постфиксная операция,, она передает управление префиксной. Смысл такого объявления состоит в том, что префиксный и постфиксный инкременты выполняют одинаковые действия, что справедливо и для базовых типов, только в разные моменты. Определение одного через другой экономит время, и вам остается отладить только функцию, определяющую значение операции ++ в контексте объекта класса х.