Можно ли явно вызвать конструктор и деструктор в С++?
Конструктор — это специальная функция-член, которая автоматически вызывается компилятором при создании объекта, а деструктор также является специальной функцией-членом, которая также неявно вызывается компилятором, когда объект выходит за пределы области видимости. Они также вызываются, когда динамически выделяемый объект выделяется и уничтожается, оператор 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 . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.