Можно ли явно вызвать конструктор и деструктор в С++?

Опубликовано: 15 Сентября, 2022

Конструктор — это специальная функция-член, которая автоматически вызывается компилятором при создании объекта, а деструктор также является специальной функцией-членом, которая также неявно вызывается компилятором, когда объект выходит за пределы области видимости. Они также вызываются, когда динамически выделяемый объект выделяется и уничтожается, оператор new выделяет память и вызывает конструктор, оператор удаления вызывает деструктор и освобождает память, выделенную оператором new.

Можно ли явно вызвать конструктор и деструктор?

Да, программист может явно вызывать специальные функции-члены.

Пример:

Выход:

Constructor is executed
Destructor is executed
Constructor is executed
Destructor is executed
Destructor is executed 

Когда конструктор вызывается явно, компилятор создает безымянный временный объект, который сразу же уничтожается. Вот почему 2-я строка в выводе вызывается деструктором.

Вот разговор между мной и доктором Бьярн Страуструпом по почте на эту тему:

Я: Почему C++ позволяет явно вызывать конструктор? Вам не кажется, что этого не должно быть?

Д-р Бьярн: Нет. Временные объекты типов классов бесполезны.

Как только для объекта вызывается деструктор, этот объект больше не существует; поведение не определено, если деструктор вызывается для объекта, время жизни которого закончилось [Пример: если деструктор для автоматического объекта вызывается явно, а блок впоследствии покидает таким образом, который обычно вызывал бы неявное уничтожение объекта, поведение не определено. — конец примера].

  • Мы никогда не должны вызывать деструктор явно для локального (автоматического) объекта, потому что это может привести к очень плохим результатам.
  • Локальные объекты автоматически уничтожаются компилятором, когда они выходят за пределы области видимости, и это гарантия языка C++.

Как правило, специальные функции-члены не следует вызывать явно. Конструктор и деструктор также могут быть вызваны из функции-члена класса.

Пример:

Выход:

Constructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Destructor is executed

Явный вызов деструктора необходим только тогда, когда объект помещается в определенное место в памяти с помощью нового размещения. Деструктор не следует вызывать явно при динамическом размещении объекта, поскольку оператор удаления автоматически вызывает деструктор.

Пример:

Выход:

Constructor is executed
Destructor is executed
Constructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Destructor is executed
Destructor is executed

Эта статья предоставлена Знакомьтесь с Pravasi . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.

C++ C