TGViewer
C/C++ | Вопросы собесов C/C++ | Вопросы собесов @easy_c_plus · 4.19K subscribers
Post #2072 776
🤔 Вызов 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 не применяется


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 4
More from @easy_c_plus
  1. Oct 14, 2026🤔 Какая польза от безымянного пространства имен? Безымянное пространство имен используетс…
  2. Oct 14, 2026🤔 Сколько занимает места объект пустого класса? Объект пустого класса не может иметь нуле…
  3. Oct 14, 2026Post #2569
  4. Oct 13, 2026🤔 Как устроена хеш-таблица в unordered_map? В unordered_map используется хеш-таблица с це…
  5. Oct 13, 2026🤔 Расскажите про ключевое слово _fastcall? Это соглашение о вызове функций, используемое…
  6. Oct 13, 2026Post #2566
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 →