Що таке деструктор?
Деструктор — це функція-член екземпляра, яка автоматично викликається щоразу, коли об’єкт буде знищено. Це означає, що деструктор є останньою функцією, яка буде викликана перед знищенням об’єкта.
- Деструктор також є спеціальною функцією-членом, як і конструктор. Деструктор знищує об'єкти класу, створені конструктором.
- Деструктор має таке ж ім’я, як ім’я класу, якому передує символ тильди (~).
- Неможливо визначити більше одного деструктора.
- Деструктор - це лише один із способів знищити об'єкт, створений конструктором. Тому деструктор не може бути перевантажений.
- Деструктор не вимагає аргументів і не повертає значення.
- Він автоматично викликається, коли об’єкт виходить за межі області видимості.
- Деструктор звільняє простір пам'яті, зайнятий об'єктами, створеними конструктором.
- У деструкторі об’єкти знищуються у зворотному порядку створення об’єкта.
Тут слід зауважити, що якщо об’єкт створюється за допомогою new або конструктор використовує new для виділення пам’яті, яка знаходиться в пам’яті купи або у вільному сховищі, деструктор повинен використовувати delete, щоб звільнити пам’ять.
Синтаксис
Синтаксис для визначення деструктора в класі:
~ () { // some instructions }> Синтаксис для визначення деструктора поза класом:
:: ~() { // some instructions }> Приклад 1
Наведений нижче код демонструє автоматичне виконання конструкторів і деструкторів під час створення та знищення об’єктів відповідно.
C++
Шилпа Шетті
// C++ program to demonstrate the execution of constructor> // and destructor> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>'
Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>Вихід
Constructor executed Destructor executed>
Приклад 2
Наведений нижче код демонструє автоматичне виконання конструкторів і деструкторів кожного разу, коли створюється і знищується кілька об’єктів відповідно.
C++
// C++ program to demonstrate the execution of constructor> // and destructor when multiple objects are created> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>'
Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >// Create multiple objects of the Test class> >Test t, t1, t2, t3;> >return> 0;> }> |
>
>Вихід
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
Приклад 3
Наведена нижче програма C++ демонструє кількість викликів конструкторів і деструкторів.
C++
// C++ program to demonstrate the number of times> // constructor and destructors are called> #include> using> namespace> std;> static> int> Count = 0;>//It is static so that every class object has the same value> class> Test {> public>:> >// User-Defined Constructor> >Test()> >{> >// Number of times constructor is called> >Count++;> >cout <<>'No. of Object created: '> << Count> ><< endl;> >}> >// User-Defined Destructor> >~Test()> >{> > >cout <<>'No. of Object destroyed: '> << Count>//It will print count in> ><< endl;>//decending order> >Count--;> >// Number of times destructor is called> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }> |
оператор if else java
>
>
Вихід
No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>
Примітка: Об'єкти знищуються в порядку, зворотному їх створенню. У цьому випадку t3 знищується першим, а t - останнім.
Властивості деструктора
Нижче наведено основні властивості Destructor:
- Функція деструктора автоматично викликається, коли об'єкти знищуються.
- Він не може бути оголошений static або const.
- Деструктор не має аргументів.
- Він не має типу повернення, навіть void.
- Об'єкт класу з деструктором не може стати членом об'єднання.
- Деструктор має бути оголошений у загальнодоступній частині класу.
- Програміст не може отримати доступ до адреси деструктора.
Коли викликається деструктор?
Функція деструктора викликається автоматично, коли об’єкт виходить за межі:
- функція закінчується
- програма закінчується
- завершується блок, що містить локальні змінні
- викликається оператор видалення
Примітка: руйнівник також можна викликати явно для об'єкта.
Як явно викликати деструктори?
Ми можемо викликати деструктори явно за допомогою наступного оператора:
object_name.~class_name()>
Чим деструктори відрізняються від звичайних функцій-членів?
- Деструктори мають те саме ім’я, що й клас, перед яким стоїть тильда (~)
- Деструктори не приймають жодних аргументів і нічого не повертають
C++
#include> using> namespace> std;> class> String {> private>:> >char>* s;> >int> size;> public>:> >String(>char>*);>// constructor> >~String();>// destructor> };> String::String(>char>* c)> {> >size =>strlen>(c);> >s =>new> char>[size + 1];> >strcpy>(s, c);> }> String::~String() {>delete>[] s; }> int> main()> {> >String str =>'Hello, World!'>;> >String myString(str);> >cout <<>'String: '> << myString.s << endl;> >return> 0;> }> |
>
>
Чи може бути більше одного деструктора в класі?
Ні, у класі може бути лише один деструктор із назвою класу перед ~, без параметрів і без типу повернення.
Коли нам потрібно написати визначений користувачем деструктор?
Якщо ми не пишемо власний деструктор у класі, компілятор створює для нас деструктор за замовчуванням. Деструктор за замовчуванням працює добре, якщо ми не маємо динамічно виділеної пам’яті або покажчика в класі. Коли клас містить вказівник на пам’ять, виділену в класі, ми повинні написати деструктор, щоб звільнити пам’ять до того, як екземпляр класу буде знищено. Це необхідно зробити, щоб уникнути витоку пам'яті.
Чи може деструктор бути віртуальним?
Так. Насправді, якщо у нас є віртуальна функція, це завжди гарна ідея зробити деструктори віртуальними в базовому класі. Для отримання додаткової інформації див. віртуальний деструктор.
Ви можете взяти участь у тесті про деструктори.
Схожі статті
- Конструктори в С++
- Віртуальний руйнівник
- Чистий віртуальний деструктор у C++