Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_CPP-1.doc
Скачиваний:
3
Добавлен:
02.09.2019
Размер:
83.46 Кб
Скачать

Изучение порядка вызова конструкторов и деструкторов (класс содержит поля данных, являющиеся объектами других классов)

Предположим, что в определении класса некоторые поля являются объектами других классов (композиция).

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 (порядок вызова конструкторов и деструкторов)

Чтобы определить порядок вызова конструкторов и деструкторов, эти функции-члены классов выводят на экран сообщения о своем вызове.

  1. Описать два класса Inner1 и Inner2, имеющих по одному полю типа int и по два конструктора: один без параметров, а другой — с параметром для инициализации поля данных.

  2. В каждом конструкторе предусмотреть вывод на экран соответствующего ему сообщения типа: "Конструктор с параметром класса Inner1"

  3. Описать класс (class) Test, в котором имеется одно поле данных a1 типа Inner1. Создать два конструктора для класса Test (без параметров и с одним параметром int), которые выдают на экран сообщения об их вызове. Параметр конструктора использовать для инициализации поля a1.

  4. В описание каждого класса (Test, Inner1, Inner2) добавить деструктор, в котором выводится сообщения, что вызван деструктор для объекта данного класса.

  5. В функции main описать объект типа Test, инициализируемый произвольным целым значением. Изучить порядок вызова конструкторов и деструкторов, применяя по очереди два способа инициализации поля a1: традиционный (в теле конструктора) и новый (вне тела).

  6. Изменить описание класса Test, добавив второе поле данных a2 типа Inner2. Изменить конструктор с параметром: его аргумент использовать для инициализации одинаковым значением полей a1 и a2.

  7. В новой функции main описать неинициализированную переменную X типа Test и запустить программу. Какие конструкторы вызваны, в каком порядке? В каком порядке вызваны деструкторы?

  8. В новой функции main описать переменную y типа Test, которая инициализируется некоторым значением (например, 1). Запустить программу. Какие конструкторы вызваны, в каком порядке? В каком порядке вызваны деструкторы?

  9. Внести изменения в описание класса Test: поменять местами порядок описания полей a1 и a2. При условиях пункта 4 запустить программу и выяснить, как изменился порядок вызова конструкторов и деструкторов. Вернуть порядок старый описаний и поменять порядок инициализации полей a1 и a2 в конструкторе. Влияет ли этот порядок на вызов конструкторов и деструкторов?

  10. Учитывая результаты пп. 3 – 5, сформулировать правила вызовов конструкторов и деструкторов для классов, с "вложенными" в них объектами других классов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]