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 вы видите, насколько прост просмотр каталога с помощью этого класса,

h03981.jpg

1 // DIRLIST.СРР - Листинг из главы 14

2 ftinciude "dirlist.h" // содержит описание класса DIRbIST

3 void main()

4 {

5 // конструктор по умолчанию использует "*.*"

6 // проверка list; цикла использует операцию преобразования, // возвращающую значение done