Деструктори в 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.
- Об'єкт класу з деструктором не може стати членом об'єднання.
- Деструктор має бути оголошений у загальнодоступній частині класу.
- Програміст не може отримати доступ до адреси деструктора.
Коли викликається деструктор?
Функція деструктора викликається автоматично, коли об’єкт виходить за межі:
- функція закінчується
- програма закінчується
- завершується блок, що містить локальні змінні
- викликається оператор видалення
Примітка: руйнівник також можна викликати явно для об'єкта.
Як явно викликати деструктори?
Ми можемо викликати деструктори явно за допомогою наступного оператора:
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++