Программирование >>  Структурное программирование 

1 ... 153 154 155 [ 156 ] 157 158 159 ... 342


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)



1 ... 153 154 155 [ 156 ] 157 158 159 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика