Порядок работы конструктора и деструктора
Конструктор
Конструктор класса выполняется в следующем порядке:
- Вызов конструктора базового класса: Если класс является производным, сначала вызывается конструктор базового класса.
- Инициализация членов данных: Члены данных инициализируются в порядке их объявления в классе, не в порядке их перечисления в списке инициализации.
- Выполнение тела конструктора: Выполняется код внутри тела конструктора.
Деструктор
Деструктор класса выполняется в следующем порядке:
- Выполнение тела деструктора: Выполняется код внутри тела деструктора.
- Уничтожение членов данных: Члены данных уничтожаются в порядке, обратном их объявлению в классе.
- Вызов деструктора базового класса: Если класс является производным, вызывается деструктор базового класса.
Пример
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base constructor" << std::endl;
}
~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Member {
public:
Member() {
std::cout << "Member constructor" << std::endl;
}
~Member() {
std::cout << "Member destructor" << std::endl;
}
};
class Derived : public Base {
private:
Member member1;
Member member2;
public:
Derived() {
std::cout << "Derived constructor" << std::endl;
}
~Derived() {
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Derived obj;
return 0;
}
Ожидаемый вывод
Base constructor
Member constructor
Member constructor
Derived constructor
Derived destructor
Member destructor
Member destructor
Base destructor
Пояснение
-
Конструкторы:
- Сначала вызывается конструктор базового класса
Base
. - Затем инициализируются члены данных
member1
иmember2
в порядке их объявления. - После этого выполняется тело конструктора производного класса
Derived
.
- Сначала вызывается конструктор базового класса
-
Деструкторы:
- Сначала выполняется тело деструктора производного класса
Derived
. - Затем уничтожаются члены данных
member2
иmember1
в порядке, обратном их объявлению. - После этого вызывается деструктор базового класса
Base
.
- Сначала выполняется тело деструктора производного класса