суббота, 5 декабря 2009 г.

6.13. Когда вызываются конструкторы и деструкторы

Конструкторы и деструкторы вызываются автоматически. Последователь­ность, в которой выполняется вызов этих функций, зависит от последова­тельности, в которой процесс выполнения входит и выходит из областей действия, в которых создаются объекты. В общем случае вызовы деструктора выполняются в порядке, обратном вызовам конструктора. Однако, классы памяти могут изменять последовательность вызовов деструкторов.
Конструкторы объектов, объявленных в глобальной области действия, вызываются раньше, чем любая функция данного файла (включая main) на-
чинает выполняться. Соответствующие деструкторы вызываются, когда за­вершается 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)

Комментариев нет:

Отправить комментарий