Глава 16. Перегрузка операций_______________________________397

При написании программ мы можем визуально проверять положение операций ++ и —. Некоторые сложности появляются тогда, когда мы пытаемся перегрузить эти оператор-функции. Общий вид операций инкремент и декремент

Т& operator++(); // где Ts — ссылка на тип объекта

И

Т& operator—0;

соответственно. Тут уже невозможно визуально различить префиксную и постфиксную формы. С этой целью в постфиксную форму искусственно введен беззнаковый целочисленный аргумент, поэтому объявление постфиксной оператор-функции выглядит так:

Т& operator++(int); // постфиксная форма; возвращает ссылку на Т, // а аргумент int остается невостребованным

*

И

Т& operator++(int);

Введение перегруженных операций, как префиксных, так и постфиксных, не вносит изменений в ваш код. Целочисленный аргумент никогда не используется, он служит только для того, чтобы компилятор мог различить объявления этих функций в классе.

Было бы неразумным перегружать постфиксную операцию без префиксной и наоборот. Рассмотрим пример класса х с парой перегруженных инкрементов:

class X

(

public:

// ...

Xs operator++(); // префиксный инкремент

Х& operator++(int); // постфиксный инкремент,

{ return operator++О; } // реализован на основе префиксного

t;

Достаточно распространено определение одной операции из пары через вторую. Когда в классе х вызывается постфиксная операция,, она передает управление префиксной. Смысл такого объявления состоит в том, что префиксный и постфиксный инкременты выполняют одинаковые действия, что справедливо и для базовых типов, только в разные моменты. Определение одного через другой экономит время, и вам остается отладить только функцию, определяющую значение операции ++ в контексте объекта класса х.