|
Программирование >> Структурное программирование
Замечание по технике программирования 7.3 Конаантные элементы класса (объекты и переменные ) должны получать начальные значения с помощью инициализаторов элементов. Присваивания недопустимы. 7.3. Композиция: классы как элементы других классов Поскольку объекту класса AlarmClock необходимо знать, когда предполагается подача сигнала тревоги, то почему бы не включить объект Time как элемент объекта AlarmClock? Такая возможность называется композицией. Класс может включать в себя объекты других классов в качестве элементов. Замечание по технике программирования 7.4 Одним из способов повторного использования программного обеспечения является композиция, когда класс включает в себя объекты других классов в качестве элементов. Когда объект входит в область действия, автоматически вызывается его конструктор и нам надо указать, как аргументы передаются конструкторам объектов-элементов. Объекты-элементы создаются в том порядке, в котором они объявлены (а не в том порядке, в котором они перечислены в списке инициализаторов элементов конструктора), и до того, как будут созданы объекты включающего их класса. Программа на рис. 7.4 использует классы Employee и Date для демонстрации объектов как элементов других объектов. Класс Employee содержит закрытые данные-элементы lastName, firstName, birthDate и hireDate. Элементы birthDate и hireDate являются объектами класса Date, который содержит закрытые данные-элементы month, day и year. Программа создает объект Employee, задает начальные значения его данным-элементам и отображает их на экране. Приведем синтаксис заголовка функции в описании конструктора Employee: Employee::Employee (char *fname, char *lname, int bmonth, int bday, int byear, int hmonth, int hday, int hyear) : birthDate(bmonth, bday, byear), hireDay(hmonth, hday, hyear) Этот конструктор принимает восемь аргументов (fname, Iname, bmonth, bday, byear, hmonth, hday и hyear). Двоеточие в заголовке отделяет инициализаторы элементов от списка параметров. Инициализаторы элементов ука- Типичная ошибка программирования 7.5 Нет инициализаторов конаантных данных-элементов. зывают, что аргументы Employee передаются конструкторам объектов-элементов. В частности, bmonth, bday и Ьуеаг передаются конструктору birth-Date, а hmonth, hday и hyear - конструктору hirehDate. Инициализаторы элементов в списке разделяются запятыми. Объекты-элементы не нуждаются в задании начальных значений посредством инициализаторов элементов. Если инициализаторы элементов не заданы, конструктор с умолчанием объекта-элемента будет вызван автоматически. Значения, если они были установленные конструктором с умолчанием, могут быть затем изменены с помощью функций записи set . Типичная ошибка программирования 7.6 Не предусмотрен конструктор с умолчанием для объекта-элемента, когда для этого объекта элемента не задан инициализатор элементов. Это может привести к тому, что объект-элемент не будет инициализирован. Совет по повышению эффективности 7.1 Инициализируйте объекты-элементы явно с помощью инициализаторов элементов. Это исключает накладные расходы связанные с повторной инициализацией объектов-элементов: первой при вызове конструктора с умолчанием объекта-элемента и второй при задании начальных значений объекта-элемента с помощью функции записи set . DATE1.H Объявление класса Date. Функции-элементы определены в ttifndef DATE1 H #define DATEl Н DATEl.СРР class Date { public: Date(int = 1, int = 1, int = 1900); конструктор no умолчанию void print 0 const; печать данных в формате месяц/день/год private: int month; int day; int year; 1-12 1-31 в зависимости от месяца любой год функция утилита для проверки соответствия дня месяцу и году int checkDay(int); #endif Рис. 7.4. Использование инициализаторов объектов-элементов (чааь 1 из 5) DATE1.CPP Определения функций-элементов класса Date. iinclude <iostream.h> #include datel.h Конструктор: поддержка соответствующего зйачения месяца; вызов функции-утилиты checkDay для поддержки соответствующего значения дня. Date::Date(int mn, int dy, int yr) if (mn > 0 && mn <= 12) проверка месяца month = mn; else { month = 1; cout Месяц mn << неправильный. Установлен месяц 1. endl; year = yr; day = CheckDay(dy); можно было бы тоже проверить проверка дня cout << Конструктор объекта Date ; print О; cout endl; Функция-утилита для поддержки соответствующего значения дня в зависимости от месяца и года, int Date::CheckDay(int testDay) { static int daysPerMonth[13] = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; if (testDay > 0 && testDay <= daysPerMonth[month]) return testDay; if (month == 2 && testDay == 29 &S (year % 400 == 0 (year % 4 return testDay; Февраль: проверка високосного года О S& year % 100 != 0))) cout День testDay неправильный. Установлен день 1. endl; return 1; если неверное значение, объект остается в непротиворечивом состоянии Печать объекта Date в форме месяц/день/год void Date::print О const { cout month / day / year;}
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |