В C++ конструктор вызывается автоматически при создании объекта, а деструктор – при его уничтожении. Однако, если говорить о вызове конструктора и деструктора как function call (операция
()), то такой вызов невозможен напрямую, потому что конструкторы и деструкторы не являются обычными функциями. 🚩Вызов конструктора (function call)
Конструктор вызывается только через создание объекта
class A {
public:
A() { std::cout << "Конструктор A\n"; }
};
int main() {
A obj; // Автоматический вызов конструктора
}Нельзя вызвать конструктор явно как функцию. Попытка вызвать конструктор напрямую приведет к ошибке
A(); // ❌ Ошибка: нельзя вызвать конструктор как обычную функцию
Можно вручную вызвать конструктор через
placement new #include <iostream>
#include <new>
class A {
public:
A() { std::cout << "Конструктор A\n"; }
~A() { std::cout << "Деструктор A\n"; }
};
int main() {
char buffer[sizeof(A)]; // Выделяем сырую память под объект
A* obj = new (buffer) A; // Вызываем конструктор вручную (placement new)
obj->~A(); // Вызываем деструктор вручную
return 0;
}
🚩Вызов деструктора (function call)
Деструктор вызывается автоматически при уничтожении объекта
class A {
public:
~A() { std::cout << "Деструктор A\n"; }
};
int main() {
A obj; // Деструктор вызовется автоматически при выходе из `main`
}Можно вызвать деструктор вручную, но это редко нужно. Деструктор можно вызвать явно, используя
~ИмяКласса() A obj;
obj.~A(); // Вызов деструктора вручную (обычно не нужен)
Деструктор обязательно вызывается вручную при
new. Если объект создается через new, то его нужно удалить вручную через delete, иначе будет утечка памяти: A* ptr = new A();
delete ptr; // Автоматически вызывает деструктор
Вызов деструктора при
placement new. Если объект создавался с placement new, то деструктор вызывается вручную char buffer[sizeof(A)];
A* obj = new (buffer) A;
obj->~A(); // Явный вызов деструктора, так как delete не применяется
Ставь 👍 и забирай 📚 Базу знаний