|
Программирование >> Структурное программирование
7.2 Константные объекты и функции-элементы Мы еще раз особо отмечаем принцип наименьших привилегий как один из наиболее фундаментальных принципов создания хорошего программного обеспечения. Рассмотрим один из способов применения этого принципа к объектам. Некоторые объекты должны допускать изменения, другие - нет. Программист может использовать ключевое слово const для указания на то, что объект неизменяем - является константным и что любая попытка изменить объект является ошибкой. Например, const Time noon(12. О, 0); объявляет как константный объект noon класса Time и присваивает ему начальное значение 12 часов пополудни. Замечание по технике программирования 7.1 Объявление константного объекта помогает провеаи в жизнь принцип наименьших привилегий. Случайные попытки изменить объект отлавливаются во время компиляции и не вызывают ошибок во время выполнения. Компиляторы С-н- воспринимают объявления const настолько неукоснительно, что в итоге не допускают никаких вызовов функций-элементов константных объектов (некоторые компиляторы дают в этих случаях только предупреждения). Это жестоко, поскольку клиенты объектов возможно захотят использовать различные функции-элементы чтения get , а они, конечно, не изменяют объект. Чтобы обойти это, программист может объявить константные функции-элементы; только они могут оперировать константными объектами. Конечно, константные функции-элементы не могут изменять объект - это не позволит компилятор. Константная функция указывается как const и в объявлении, и в описании с помощью ключевого слова const после списка параметров функции, но перед левой фигурной скобкой, которая начинает тело функции. Например, в приведенном ниже предложении объявлена как константная функция-элемент некоторого класса А int А::getValue () const {return privateDateMember}; которая просто возвращает значение одного из данных-элементов объекта. Если константная функция-элемент описывается вне определения класса, то как объявление функции-элемента, так и ее описание должны включать const. Здесь возникает интересная проблема для конструкторов и деструкторов, которые обычно должны изменять объект. Для конструкторов и деструкторов константных объектов объявление const не требуется. Конструктор должен иметь возможность изменять объект с целью присваивания ему соответствующих начальных значений. Деструктор должен иметь возможность выполнять подготовку завершения работ перед уничтожением объекта. Программа на рис. 7.1 создает константный объект класса Time и пытается изменить объект неконстантными функциями-элементами setHour, setMinute и setSecond. Как результат показаны сгенерированные компилятором Borland С-Н- предупреждения. Опция компилятора была установлена такой, чтобы в случае появления любого предупреждения компилятор не создавал исполняемого файла. Щ II TIME5.H Объявление класса Time. II Функции-элементы описаны в TIMES.СРР #ifndef Т1МЕ5 Н #define TIMES Н class Time { public: Time(int = 0, int 0, int =0); конструктор no умолчанию функции записи set void setTime(int, int, int) void setHour(int); void setMinute(int); void setSecond(int); установка времени установка часа установка минут установка секунд II функции чтения 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 #endif Рис. 7.1. Использование класса Time с конаантными объектами и константными функциями-элементами (часть 1 из 3) Хороший стиль программирования 7.1 Объявляйте как const все функции-элементы, которые предполагается использовать с конаантными объектами. Типичная ошибка программирования 7.1 Описание константной функции-элемента, которая изменяет данные-элементы объ екта. Типичная ошибка программирования 7.2 Описание константной функции-элемента, которая вызывает неконстантную функ цию-элемент. II TIME5.CPP Описания функций-элементов класса Time, tinclude <iostream.h> iinclude times.h Функция конструктор для инициализации закрытых данных. По умолчанию значения равны О (смотри описание класса). Time::Time(int hr, int min, int sec) { setTime(hr, min, sec);} Установка значений часа, минут и секунд, void Time::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; Установка значения часа void Time::setHour(int h) { hour = (h >= 0 && h < 24) ? h : 0; } Установка значения минут void Time::setMinute(int m) { minute = (m >= 0 && m < 60) ? m : 0; } Установка значения секунд void Time::setSecond(int s) { second = (s >= 0 && s < 60) ? s : 0; } Чтение значения часа 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 ? O : ) minute : (second < 10 ? 0 : ) second; Отображение времени в стандартном формате: HH:MM:SS AM (или РМ) void Time::printStandardО const { cout ((hour == 12) ? 12: hour % 12) : (minute < 10 ? 0 : ) minute : (second < 10 ? 0 : ) second (hour< 12 ? AM : PM ) ; Рис. 7.1. Использование класса Time с константными объектами и константными функциями-элементами (часть 2 из 3)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |