|
Программирование >> Структурное программирование
FIG6 8.CPP Демонстрация функции конструктора с умолчанием для класса Time, tinclude <iostream.h> tinclude time2.h main() { Time tl, t2(2), t3(21, 34), t4 (12, 25, 42), t5(27, 74, 99); cout << Варианты: << endl все аргументы по умолчанию: endl ; tl.printMilitary(); cout endl ; tl.printStandard() ; cout endl часы заданы; минуты и секунды по умолчанию: endl ; t2.printMilitary(); cout endl ; t2.printStandard(); cout << endl часы и минуты заданы; секунды по умолчанию: endl ; t3.printMilitary(); cout endl ; t3.printStandard(); cout endl << часы, минуты и секунды заданы: endl ; t4.printMilitary(); cout endl ; t4.printStandard0; cout endl все значения заданы неверно: endl ; t5.printMilitary(); cout endl ; t5.printStandard(); return 0; } Рис. 6.8. Использование конаруктора с аргументами по умолчанию (часть 3 из 4) Для каждого класса может существовать только один конструктор с yMOJt-чанием. В этой программе конструктор вызывает функцию-элемент setTime со значениями, передаваемыми конструктору (или значениями по умолчанию), чтобы гарантировать, что значение, предназначенное для hour, находится в диапазоне от О до 23, а значения для minute и second - в диапазоне от О до 59. Если значение выходит за пределы диапазона, оно устанавливается равным нулю с помощью setTime (это пример гарантии того, что данные-элементы будут в непротиворечивом состоянии). Варианты: все аргументы по умолчанию: 00:00:00 12:00:00 AM часы заданы; минуты и секунды по умолчанию: 02:00:00 2:00:00 AM часы и минуты заданы; секунды по умолчанию: 21:34:00 9:34:00 РМ часы, минуты и секунды заданы: 12:25:42 12:25:42 РМ все значения заданы неверно: 00:00:00 12:00:00 AM Рис. 6.8. Использование конструктора с аргументами по умолчанию (часть 4 из 4) Заметим, что конструктор Time мог бы быть написан с включением тех же самых операторов, что имеются в функции-элементе setTime. Это могло бы быть несколько более эффективным, потому что исключается лишний вызов setTime. Однако, одинаковые коды в конструкторе Time и в функции-элементе setTime затруднят сопровождение этой программы. Если реализация функции-элемента setTime изменится, соответствующие изменения надо будет вносить и в реализацию конструктора Time. То, что конструктор Time непосредственно вызывает setTime, позволяет делать любые изменения только в реализации setTime. Это уменьшает вероятность ошибки программирования при изменениях в реализации. Кроме того, эффективность конструктора Time может быть увеличена путем явного объявления конструктора inline или путем описания конструктора в определении класса (это означает неявное определение функции как inline). Замечание по технике программирования 6.16 Если функция-элемент класса уже обеспечивает все или часть функциональных возможностей, требуемых конструктором (или другой функцией-элементом), вызывайте эту функцию-элемент из конструктора (или другой функции-элемента). Это упрощает сопровождение программы и уменьшает вероятность ошибки при изменении реализации кода. Хороший стиль программирования 6.9 Объявляйте аргументы функции по умолчанию только в прототипе функции внутри определения класса в заголовочном файле. Типичная ошибка программирования 6.6 Указание начальных значений по умолчанию для одной и той же функции-элемента как в заголовочном файле, так и в описании функции-элемента. Программа на рис. 6.8 создает 5 экземпляров объектов Time и задает им начальные значения: одному - со всеми тремя аргументами по умолчанию в вызове конструктора, второму - с одним указанным аргументам, третье- му - с двумя указанными аргументами, четвертому - с тремя указанными аргументами и пятому - с тремя неверно указанными аргументами. Отображается содержание данных каждого объекта после его создания и задания начальных значений. Если для класса не определено никакого конструктора, компилятор создает конструктор с умолчанием. Такой конструктор не задает никаких начальных значений, так что после создания объекта нет никакой гарантии, что он находится в непротиворечивом состоянии. 6.12. Использование деструкторов Деструктор - это специальная функция-элемент класса. Имя деструктора совпадает с именем класса, но перед ним ставится символ тильда (-). Это соглашение о наименовании появилось интуитивно, потому что, как мы увидим в последующих главах, операция тильда является поразрядной операцией дополнения, а по смыслу деструктор является дополнением конструктора. Деструктор класса вызывается при уничтожении объекта - например, когда выполняемая программа покидает область действия, в которой был создан объект этого класса. На самом деле деструктор сам не уничтожает объект - он выполняет подготовку завершения перед тем, как система освобождает область памяти, в которой хранился объект, чтобы использовать ее для размещения новых объектов. Деструктор не принимает никаких параметров и не возвращает никаких значений. Класс может иметь только один деструктор - перегрузка деструктора не разрешается. Типичная ошибка программирования 6.7 Попытки передать аргументы деструктору, вернуть значения из деструктора или перегрузить деаруктор. Заметим, что представленные до сих пор классы не были обеспечены деструкторами. На самом деле, деструкторы редко используются с простыми классами. В главе 8 мы увидим, что деструкторы имеют смысл в классах, использующих динамическое распределение памяти под объекты (например, для массивов и строк). В главе 7, мы обсудим, как динамически распределять и перераспределять память. 6.13. Когда вызываются конструкторы и деструкторы Конструкторы и деструкторы вызываются автоматически. Последовательность, в которой выполняется вызов этих функций, зависит от последовательности, в которой процесс выполнения входит и выходит из областей действия, в которых создаются объекты. В общем случае вызовы деструктора выполняются в порядке, обратном вызовам конструктора. Однако, классы памяти могут изменять последовательность вызовов деструкторов. Конструкторы объектов, объявленных в глобальной области действия, вызываются раньше, чем любая функция данного файла (включая main) на-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |