logo

Деструктори в 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;> }>

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

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

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

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

>

>

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

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

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

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

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

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

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

Схожі статті