Порядок работы конструктора и деструктора
Конструктор
Конструктор класса выполняется в следующем порядке:
- Вызов конструктора базового класса: Если класс является производным, сначала вызывается конструктор базового класса.
- Инициализация членов данных: Члены данных инициализируются в порядке их объявления в классе, не в порядке их перечисления в списке инициализации.
- Выполнение тела конструктора: Выполняется код внутри тела конструктора.
Деструктор
Деструктор класса выполняется в следующем порядке:
- Выполнение тела деструктора: Выполняется код внутри тела деструктора.
- Уничтожение членов данных: Члены данных уничтожаются в порядке, обратном их объявлению в классе.
- Вызов деструктора базового класса: Если класс является производным, вызывается деструктор базового класса.
Пример
#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.
 
- Сначала выполняется тело деструктора производного класса