Деструктори в C++

Що таке деструктор?

Деструктор — це функція-член екземпляра, яка автоматично викликається щоразу, коли об’єкт буде знищено. Це означає, що деструктор є останньою функцією, яка буде викликана перед знищенням об’єкта.

  • Деструктор також є спеціальною функцією-членом, як і конструктор. Деструктор знищує об'єкти класу, створені конструктором.
  • Деструктор має таке ж ім’я, як ім’я класу, якому передує символ тильди (~).
  • Неможливо визначити більше одного деструктора.
  • Деструктор - це лише один із способів знищити об'єкт, створений конструктором. Тому деструктор не може бути перевантажений.
  • Деструктор не вимагає аргументів і не повертає значення.
  • Він автоматично викликається, коли об’єкт виходить за межі області видимості.
  • Деструктор звільняє простір пам'яті, зайнятий об'єктами, створеними конструктором.
  • У деструкторі об’єкти знищуються у зворотному порядку створення об’єкта.

Тут слід зауважити, що якщо об’єкт створюється за допомогою 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;> }>

Вихід

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.
  • Об'єкт класу з деструктором не може стати членом об'єднання.
  • Деструктор має бути оголошений у загальнодоступній частині класу.
  • Програміст не може отримати доступ до адреси деструктора.

Коли викликається деструктор?

Функція деструктора викликається автоматично, коли об’єкт виходить за межі:

  1. функція закінчується
  2. програма закінчується
  3. завершується блок, що містить локальні змінні
  4. викликається оператор видалення

Примітка: руйнівник також можна викликати явно для об'єкта.

Як явно викликати деструктори?

Ми можемо викликати деструктори явно за допомогою наступного оператора:

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;> }>

Чи може бути більше одного деструктора в класі?

Ні, у класі може бути лише один деструктор із назвою класу перед ~, без параметрів і без типу повернення.

Коли нам потрібно написати визначений користувачем деструктор?

Якщо ми не пишемо власний деструктор у класі, компілятор створює для нас деструктор за замовчуванням. Деструктор за замовчуванням працює добре, якщо ми не маємо динамічно виділеної пам’яті або покажчика в класі. Коли клас містить вказівник на пам’ять, виділену в класі, ми повинні написати деструктор, щоб звільнити пам’ять до того, як екземпляр класу буде знищено. Це необхідно зробити, щоб уникнути витоку пам'яті.

Чи може деструктор бути віртуальним?

Так. Насправді, якщо у нас є віртуальна функція, це завжди гарна ідея зробити деструктори віртуальними в базовому класі. Для отримання додаткової інформації див. віртуальний деструктор.

Ви можете взяти участь у тесті про деструктори.

Схожі статті