![](/user_photo/2706_HbeT2.jpg)
- •Лабораторная работа
- •Перегрузка функций
- •Значения аргументов функций, принимаемые по умолчанию
- •Константные поля
- •Изучение порядка вызова конструкторов и деструкторов
- •В) в классе определен деструктор, в котором предусмотрен только вывод сообщения
- •Изучение порядка вызова конструкторов и деструкторов (класс содержит поля данных, являющиеся объектами других классов)
- •Вопросы для контроля
Изучение порядка вызова конструкторов и деструкторов (класс содержит поля данных, являющиеся объектами других классов)
Предположим, что в определении класса некоторые поля являются объектами других классов (композиция).
class Example{ //вспомогательный класс
Example(int i, float f){…}// конструктор
}
class Test{
char* ptr;
Example field; //определяем поле-объект класса Example
…
}
Чтобы создать объект класса Test, нужно выполнить его конструктор, в котором нужно инициализировать поле-объект field. А для этого нужно вызывать конструктор класса Example.
Так как у каждого объекта имеется свой собственный набор полей, определенных в классе, со своими значениями, то инициализация поля при его описании в классе невозможна. Поэтому для передачи инициализирующих значений конструктору, вызываемому для члена класса, используется специальный синтаксис.
Конструктор класса Test может быть определен следующим образом:
Test(int w, char *pt, float t): field(w,t) {
ptr=pt;
...}
Этот синтаксис похож на инициализацию константных полей, только значений может быть несколько, по числу аргументов конструктора вспомогательного класса.
После заголовка конструктора основного класса ставится двоеточие, указывается имя инициализируемого поля и заключенный в круглые скобки список инициализирующих значений (через запятую).
Очевидно, что при разрушении объекта класса Test, помимо деструктора этого класса также потребуется вызов и деструктора класса Example.
Замечание
Этот специальный синтаксис не исключает возможность обычной инициализации полей с помощью формирования присваивания значения объектного типа в теле конструктора основного класса.
ЗАДАНИЕ 3 (порядок вызова конструкторов и деструкторов)
Чтобы определить порядок вызова конструкторов и деструкторов, эти функции-члены классов выводят на экран сообщения о своем вызове.
Описать два класса Inner1 и Inner2, имеющих по одному полю типа int и по два конструктора: один без параметров, а другой — с параметром для инициализации поля данных.
В каждом конструкторе предусмотреть вывод на экран соответствующего ему сообщения типа: "Конструктор с параметром класса Inner1"
Описать класс (class) Test, в котором имеется одно поле данных a1 типа Inner1. Создать два конструктора для класса Test (без параметров и с одним параметром int), которые выдают на экран сообщения об их вызове. Параметр конструктора использовать для инициализации поля a1.
В описание каждого класса (Test, Inner1, Inner2) добавить деструктор, в котором выводится сообщения, что вызван деструктор для объекта данного класса.
В функции main описать объект типа Test, инициализируемый произвольным целым значением. Изучить порядок вызова конструкторов и деструкторов, применяя по очереди два способа инициализации поля a1: традиционный (в теле конструктора) и новый (вне тела).
Изменить описание класса Test, добавив второе поле данных a2 типа Inner2. Изменить конструктор с параметром: его аргумент использовать для инициализации одинаковым значением полей a1 и a2.
В новой функции main описать неинициализированную переменную X типа Test и запустить программу. Какие конструкторы вызваны, в каком порядке? В каком порядке вызваны деструкторы?
В новой функции main описать переменную y типа Test, которая инициализируется некоторым значением (например, 1). Запустить программу. Какие конструкторы вызваны, в каком порядке? В каком порядке вызваны деструкторы?
Внести изменения в описание класса Test: поменять местами порядок описания полей a1 и a2. При условиях пункта 4 запустить программу и выяснить, как изменился порядок вызова конструкторов и деструкторов. Вернуть порядок старый описаний и поменять порядок инициализации полей a1 и a2 в конструкторе. Влияет ли этот порядок на вызов конструкторов и деструкторов?
Учитывая результаты пп. 3 – 5, сформулировать правила вызовов конструкторов и деструкторов для классов, с "вложенными" в них объектами других классов.