Порядок работы конструктора и деструктора

Конструктор

Конструктор класса выполняется в следующем порядке:

  1. Вызов конструктора базового класса: Если класс является производным, сначала вызывается конструктор базового класса.
  2. Инициализация членов данных: Члены данных инициализируются в порядке их объявления в классе, не в порядке их перечисления в списке инициализации.
  3. Выполнение тела конструктора: Выполняется код внутри тела конструктора.

Деструктор

Деструктор класса выполняется в следующем порядке:

  1. Выполнение тела деструктора: Выполняется код внутри тела деструктора.
  2. Уничтожение членов данных: Члены данных уничтожаются в порядке, обратном их объявлению в классе.
  3. Вызов деструктора базового класса: Если класс является производным, вызывается деструктор базового класса.

Пример

#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

Пояснение

  1. Конструкторы:

    • Сначала вызывается конструктор базового класса Base.
    • Затем инициализируются члены данных member1 и member2 в порядке их объявления.
    • После этого выполняется тело конструктора производного класса Derived.
  2. Деструкторы:

    • Сначала выполняется тело деструктора производного класса Derived.
    • Затем уничтожаются члены данных member2 и member1 в порядке, обратном их объявлению.
    • После этого вызывается деструктор базового класса Base.