Назад к вопросам
Junior
112
questionbank

Как происходит вызов конструктора и деструктора в C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Конструктор вызывается автоматически в момент создания объекта:

  • При объявлении локальной переменной: MyClass obj;
  • При динамическом выделении памяти: MyClass* ptr = new MyClass();
  • При передаче объекта по значению в функцию.
  • При возврате объекта по значению из функции.
  • При создании временного объекта.
  • При инициализации элементов массива: MyClass arr[3];
  • При создании объекта как члена другого класса.
  • При наследовании, сначала вызываются конструкторы базовых классов.

Деструктор вызывается автоматически в момент уничтожения объекта:

  • При выходе объекта за область видимости (для локальных переменных).
  • При явном удалении объекта, созданного с new: delete ptr;
  • При завершении программы (для статических и глобальных объектов).
  • При удалении элементов массива, созданного с new[]: delete[] arr;
  • При уничтожении объекта, содержащего другие объекты как члены.
  • При наследовании, сначала вызываются деструкторы производных классов.

Порядок вызова зависит от типа хранения объекта и иерархии наследования. Для локальных объектов порядок вызова конструкторов соответствует порядку объявления, а деструкторов — обратному порядку. Для базовых и производных классов: сначала конструктор базового, затем производного; деструкторы в обратном порядке.

#include <iostream>

class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }
    ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived constructor" << std::endl;
    }
    ~Derived() {
        std::cout << "Derived destructor" << std::endl;
    }
};

int main() {
    // Вызов конструктора и деструктора локального объекта
    { // Область видимости для local_obj
        Base local_obj;
    } // local_obj уничтожается, вызывается деструктор

    // Вызов конструктора и деструктора объекта на куче
    Derived* heap_obj = new Derived(); // Вызов конструктора Base, затем Derived
    delete heap_obj; // Вызов деструктора Derived, затем Base

    return 0; // Глобальные и статические объекты уничтожаются здесь
}