TGViewer
C/C++ | Вопросы собесов C/C++ | Вопросы собесов @easy_c_plus · 4.19K subscribers
Post #2179 810
🤔 Вызов function call для конструктора и деструктора?

В 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 не применяется


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_c_plus
  1. Oct 13, 2026🤔 Расскажите про ключевое слово _fastcall? Это соглашение о вызове функций, используемое…
  2. Oct 13, 2026Post #2566
  3. Oct 12, 2026🤔 Какие есть уровни exception гарантий? 1. No-throw Guarantee: метод или операция не выбр…
  4. Oct 12, 2026🤔 Какая сложность поиска в set и unordered_set? Контейнеры set и unordered_set представля…
  5. Oct 11, 2026Post #2563
  6. Oct 11, 2026🤔 Как проверять равенство двух float? Равенство двух float проверяется с учётом допустимо…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →