Когда вызываются конструкторы и деструкторы.
Конструкторы и деструкторы вызываются автоматически. Если говорить в общем, конструктор вызывается при создании объекта, а деструктор - при его уничтожении. Рассмотрим разные случаи вызова конструкторов и деструкторов для различного вида объектов.
Если объект определен глобально (т.е. вне любой функции), то конструктор вызывается в самом начале программы до вызова функции main), деструктор - по окончании программы.
Если объект определен локально (т.е. внутри функции), то конструктор вызывается, когда выполнение программы достигает определения объекта, деструктор - при выходе из блока, в котором определен объект (т.е. когда объект выходит из области видимости).
Если объект определен локально с использованием спецификатора static, конструктор вызывается сразу же, как только процесс выполнения впервые достигает места, где объект был объявлен, деструктор - в конце программы.
Пример Программы показывает последовательность, в которой вызываются конструкторы и деструкторы объектов типа CreateAndDestroy в разных областях видимости. Объект first является глобальным объектом, его конструктор вызывается, как только программа начинает выполнение, а его деструктор вызывается по завершении программы, после того, как все другие объекты уничтожены.
В функции main объявлено три объекта. Объекты second и fourth являются локальными объектами, а объектthird объявлен с классом памяти static. Конструкторы каждого из этих объектов вызываются, когда процесс выполнения достигает места, где объекты были объявлены. Деструкторы объектов fourth и second вызываются в соответствующем порядке, когда заканчивается main. Поскольку объект third - статический, то он существует до завершения программы. Деструктор объекта third вызывается раньше деструктора для first, но после уничтожения всех других объектов.
Функция create объявляет три объекта - локальные объекты fifth и seventh и статический локальный объектsixth. Деструкторы для объектов seventh и fifth вызываются в соответствующем порядке по окончании create. Поскольку sixth - статический объект, он существует до завершения программы. Деструктор для sixthвызывается раньше деструктора для third и first, но после уничтожения всех других объектов.
Программа |
/* Демонстрация последовательности, в которой вызываются конструкторы и деструкторы. */
#include<iostream.h>
// описание класса CreateAndDestroy class CreateAndDestroy { public: CreateAndDestroy(int value) // конструктор { data = value; cout << " Object " << data << " constructor"; }
~CreateAndDestroy() // деструктор { cout << " Object " << data << " destructor" << endl; } private: int data; };
CreateAndDestroy first(1); // глобальный объект
void create(void); //прототип функции
void main () { cout << "\t(global object) " << endl;
CreateAndDestroy second(2); // локальный объект cout << "\t(local auto object in main) " << endl;
static CreateAndDestroy third(3); // статический объект cout << "\t(local static object in main) " << endl;
create(); // вызов функции создания объектов
CreateAndDestroy fourth(4); // локальный объект cout << "\t(local auto object in main) " << endl; }
// Функция создания объектов void create(void) { CreateAndDestroy fifth(5); // локальный объект cout << "\t(local auto object in create) " << endl;
static CreateAndDestroy sixth(6); // статический объект cout << "\t(local static object in create) " << endl;
CreateAndDestroy seventh(7); // локальный объект cout << "\t(local auto object in create) " << endl; } |
Результаты выполнения программы |
Object 1 constructor (global object) Object 2 constructor (local auto object in main) Object 3 constructor (local static object in main) Object 5 constructor (local auto object in create) Object 6 constructor (local static object in create) Object 7 constructor (local auto object in create) Object 7 destructor Object 5 destructor Object 4 constructor (local auto object in main) Object 4 destructor Object 2 destructor Object 6 destructor Object 3 destructor Object 1 destructor |
.
- 25. Понятие объекта и класса.
- Определение методов класса
- Переопределение операций
- Подписи методов и необязательные аргументы
- Запись классов
- 26. Скрытие данных и общий интерфейс.
- 27. Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- Основное назначение конструкторов - инициализация объектов.
- Использование конструкторов с аргументами по умолчанию
- Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- Использование деструкторов
- Когда вызываются конструкторы и деструкторы.
- 28. Перегрузка классов.
- Перегрузка операторов плюс и минус
- Второй пример
- Операторы, которые Вbl he можете перегрузить
- 29. Дружественные классы.
- 30. Наследование.
- Внутреннее и защищенное наследование
- Виртуальное наследование
- 31. Множественное наследование.
- 32. Полиморфизм.
- 33. Виртуальная функция.
- 34. Передача данных по умолчанию.
- 39. Создание и уничтожение динамических объектов.
- 40. Динамические библиотеки (dll).