Назад к вопросам
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; // Глобальные и статические объекты уничтожаются здесь
}