398 __ _______Часть III. Современное программирование на С++
Возврат ссылок на объекты позволяет связывать их в цепочки:
Х х = ++у; // вызывает префиксный инкремент, а затем создает х // вызовом конструктора копий
! Предупреждение
[Перегружать префиксную операцию без постфиксной действительно плохо (как и наоборот). Предположим, мы перегрузили префиксный operator++ для класса т, но не перегрузили постфиксный. Тогда:
Т t;
++t; // нормально: префиксный ++ перегружен
НО
t++; // ошибка: постфиксный инкремент не перегружен, // приращение адреса объекта не работает
Пример перегрузки operafor++
В главе 14 "Базовые концепции классов" был определен класс DIRLIST, который использует префиксную и постфиксную операцию operator++ для просмотра оглавления каталога. Хотя такое приращение и не добавляет единицу в целочисленном смысле, оно логически очень близко, поскольку извлекает имя следующего файла каталога.
В главе 14 DIRLIST был определен как потомок ffblk. Эта структура, определенная в dir.h, содержит информацию элемента каталога файловой системы DOS. Функции findfirst и findnext требуют указателя на ffblk. DIRLIST, будучи наследником структуры ffblk, удовлетворяет этому требованию.
17: int operator++(int) { return ( done = findnext ( this)); } 18: int operator++() { return operator++(0); }
Строка 18 определяет префиксную операцию operator++ через вызов постфиксной. Постфиксная операция, определенная в строке 17, вызывает функцию findnext, запоминая результат в переменной done и его же возвращая. В листинге 16.4 вы видите, насколько прост просмотр каталога с помощью этого класса,
1 // DIRLIST.СРР - Листинг из главы 14
2 ftinciude "dirlist.h" // содержит описание класса DIRbIST
3 void main()
4 {
5 // конструктор по умолчанию использует "*.*"
6 // проверка list; цикла использует операцию преобразования, // возвращающую значение done