Конструкторы и деструкторы вызываются автоматически. Последовательность, в которой выполняется вызов этих функций, зависит от последовательности, в которой процесс выполнения входит и выходит из областей действия, в которых создаются объекты. В общем случае вызовы деструктора выполняются в порядке, обратном вызовам конструктора. Однако, классы памяти могут изменять последовательность вызовов деструкторов.
Конструкторы объектов, объявленных в глобальной области действия, вызываются раньше, чем любая функция данного файла (включая main) на-
чинает выполняться. Соответствующие деструкторы вызываются, когда завершается main или когда вызывается функция exit (смотри главу 18, «Другие темы»).
чинает выполняться. Соответствующие деструкторы вызываются, когда завершается main или когда вызывается функция exit (смотри главу 18, «Другие темы»).
Конструкторы автоматических локальных объектов вызываются, когда процесс выполнения достигает места, где объекты объявляются. Соответствующие деструкторы вызываются, когда покидается область действия объектов (т.е. покидается блок, в котором эти объекты объявлены). Конструкторы и деструкторы для автоматических объектов вызываются каждый раз при входе и выходе из области действия.
Конструкторы статических локальных объектов вызываются сразу же, как только процесс выполнения достигает места, где объекты были впервые объявлены. Соответствующие деструкторы вызываются, когда завершается main или когда вызывается функция exit.
Программа на рис. 6.9 показывает последовательность, в которой вызываются конструкторы и деструкторы объектов типа CreateAndDestroy в нескольких областях действия. Программа объявляет объект first в глобальной области действия. Его конструктор вызывается, как только программа начинает выполнение, а его деструктор вызывается по завершении программы, после того, как все другие объекты уничтожены.
Функция main объявляет три объекта. Объекты second и fourth являются локальными автоматическими объектами, а объект third — статическим локальным объектом. Конструкторы каждого из этих объектов вызываются, когда процесс выполнения достигает места, где объекты были объявлены. Деструкторы объектов fourth и second вызываются в соответствующем порядке, когда заканчивается main. Поскольку объект third — статический, он существует до завершения программы. Деструктор объекта third вызывается раньше деструктора для first, но после уничтожения всех других объектов.
Функция creat объявляет три объекта — локальные автоматические объекты fifth и seventh и статический локальный объект sixth. Деструкторы для объектов seventh и fifth вызываются в соответствующем порядке по окончании creat. Поскольку sixth — статический объект, он существует до завершения программы. Деструктор для sixth вызывается раньше деструктора для third и first , но после уничтожения всех других объектов. // CREATE.Н
// Определение класса CreatAndDestroy. //Функции-элементы определены в CREATE.CPP.
#ifndef CREATE_H #define CREATE_H
// конструктор // деструктор |
class CreateAndDestroy { public:
CreateAndDestroy(int) ; -CreateAndDestroy() ; private:
int data;
#endif
// CREATE.CPP
// Определения функций-элементов для класса CreateAndDestroy #include #include "create.h"
CreateAndDestroy::CreateAndDestroy(int value) {
data = value;
cout « "Объект " « data << " конструктор";
}
CreateAndDestroy::~CreateAndDestroy()
{ cout « "Объект " « data << " деструктор " « endl; }
Рис. 6.9. Демонстрация последовательности, в которой вызываются конструктор и деструктор
(часть 2 из 4)
// FIG6_9.CPP
// Демонстрация последовательности, в которой вызываются // конструкторы и деструкторы, iinclude <iostream.h> iinclude "create.срр"
void create(void); CreateAndDestroy first(1);
main ( ) {
// прототип // глобальный объект
cout << |
(глобальный созданный до main)" << endl;
CreateAndDestroy second(2); // локальный объект
cout « " (локальный автоматический в main)" << endl;
static CreateAndDestroy third(3); // локальный объект
cout << " (локальный статический в main)" << endl;
create(); // вызов функции создания объектов
CreateAndDestroy fourth(4); // локальный объект
cout « " (локальный автоматический в main)" << endl;
return 0; }
// Функция создания объектов void create(void)
CreateAndDestroy fifth(5);
« endl; |
cout « " (локальный автоматический в create)
static CreateAndDestroy sixth(6);
cout « " (локальный статический в create)" « endl; CreateAndDestroy seventh(7);
cout « " (локальный автоматический в create)" « endl;
конструктор
конструктор конструктор конструктор конструктор конструктор деструктор деструктор конструктор деструктор деструктор
6 деструктор
деструктор 1 деструктор
Объект Объект Объект Объект Объект Объект Объект Объект Объект Объект Объект Объект Объект Объект |
щ tsfw> |
(глобальный созданный до main) (локальный автоматический в main) (локальный статический в main) (локальный автоматический в create) (локальный статический в create) (локальный автоматический в create)
(локальный автоматический в main)
Рис. 6.9. Демонстрация последовательности, в которой вызываются конструктор и деструктор
(часть 4 из 4)
Комментариев нет:
Отправить комментарий