|
Программирование >> Структурное программирование
Одним интересным применением указателя tMs является предотвращение присваивания объекта самому себе. Как мы увидим в главе 8 Перегрузка операций , самоприсваивание может стать причиной серьезных ошибок в случаях, когда объекты содержат указатели на динамически распределяемую память. Другим применением указателя this является возможность сцепленных вызовов функций элементов. Программа на рис. 7.8 иллюстрирует возвращение ссылки на объект Time, которое дает возможность сцепления вызовов функций-элементов класса Time. Каждая из функций-элементов setTime, setHour, setMinute и setSecond возвращает *this с типом возврата Time &. Почему возвращение *this работает как ссылка? Операция точка (.) имеет ассоциативность слева направо, так что выражение t.setHour(18).setMinute(30).setSecond(22); сначала вычисляет t.setHour(18), а затем возвращает ссылку на объект t как значение вызова этой функции. TIME6.H Объявление класса Time. Функции-элементы определены в TIME6.CPP tifndef Т1МЕ6 Н tdefine TIME6 Н class Time { public: Time(int = 0, int = 0, int = 0) функции записи set Time SsetTime(int, int, int); Time SsetHour(int); Time SsetMinute(int); Time SsetSecond(int); конструктор no умолчанию установка часа, минут и секунд установка часа установка минут установка секунд функции чтения get (обычно объявляются const) int getHourО const; возвращает значение часа int getMinuteО const; возвращает значение минут int getSecondО const; возвращает значение секунд функции печати (обычно объявляются const) void printMilitaryО const; печать военного времени void printStandard() const; печать стандартного времени private: int hour; int minute; int second; 0-23 0-59 0-59 tendif Рис 7.8. Сцепление вызовов функций-элементов (часть 1 из 5) TIME6.CPP Определения функций-элементов класса Time, iinclude times.h tinclude <iostream.h> Функция конструктор для задания начальных значений закрытым данным. Вызов функций-элементов setTime для установки переменных. По умолчанию значения равны О (смотри описание класса). Time::Time(int hr, int min, int sec) ( setTime(hr, min, sec); } установка часа, минут и секунд. Time STime::setTime(int h, int m, int s) hour = (h >= 0 && h< 24) ? h: 0; minute = (m >= 0 && m < 60) ? m : 0; second = (s >= 0 && s < 60) ? s : 0; return *this; возможность сцепления Установка значения часа Time STime::setHour(int h) ( hour = (h >= 0 && h < 24) ? h : 0; return *this; возможность сцепления Установка значения минут Time STime::setMinute(int m) { minute = (m >= 0 && m < 60) ? m : 0; return *this; возможность сцепления Рис. 7.8. Сцепление вызовов функций-элементов (часть 2 из 5) Оставшееся выражение затем интерпретируется как t.setMinute(30).setSecond(22) ; Вызов t.setMinute(30) выполняется и возвращает эквивалент t. Оставшееся выражение интерпретируется как t.setSecond(22); Отметим, что вызовы t.setTime(20, 20, 20) .printStandard() также используют особенности сцепления. Эти вызовы должны появляться именно в указанной последовательности, потому что printStandard, как описано в классе, не возвращает ссылку на t. Расположение вызова printStandard в предыдущем операторе перед вызовом setTime приводит к синтаксической ошибке. TIME6.CPP: Продолжение Установка значения секунд Time STime::setSecond(int s) { second = (s >= 0 && s < 60) ? s : 0; return *this; возможность сцепления Получение значения часа int Time::getHour() const { return hour; } Получение значения минут int Time::getMinute() const { return minute; } Получение значения секунд int Time::getSecond() const { return second; } Отображение времени в военном формате: HH:MM:SS void Time::printMilitary() const cout (hour < 10 ? 0 : ) hour : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second; Отображение времени в стандартном формате: HH:MM:SS AM (или РМ) void Time::printStandard() const cout ((hour == 0 I I hour == 12) ? 12 : hour % 12) : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second (hour < 12 ? AM : PM ); Рис. 7.8. Сцепление вызовов функций-элементов (часть 3 из 5) FIG7 8.CPP Сцепление вызовов функций-элементов указателем this iinclude <iostream.h> iinclude time6.h mam ( { Time t; t.setHour(18).setMinute(30).setSecond(22); cout Военное время: ; t.printMilitary(); cout << endl Стандартное время: ; t.printStandard(); cout << endl <<endl << Новое стандартное время: t.setTime(20, 20, 20).printStandard(); cout endl; return 0; Рис. 7.8. Сцепление вызовов функций-элементов (часть 4 из 5)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |