Програмування С, С++теорія та практика (частина 2)
2.5.6 Деструктори
Деструктор - це спеціальна функція, яка є доповненням конструктора, і викликається кожного разу, коли знищується представник класу. В той час, коли функція-конструктор виділяє пам’ять для створення класових змінних, функція-деструктор звільняє цю пам’ять повністю, знищуючи змінні. Він має те саме ім’я, що й
ім’я класу, але на початку обов'язково з префіксом - тільдою(~): ~СІаааМате();.
Існує декілька правил застосування деструкторів:
1. Деструктор не має аргументів.
2. Деструктор не повертає значення.
3. Деструктор не успадковується.
4. Деструктор не може бути оголошений як соті, зіаііс, уоІаІіІе.
5. Деструктор може бути оголошений як уігіиаІ, і, найчастіше, повинен так оголошуватися, особливо у випадках, коли має місце ієрархія успадкування.
Деструктор викликається автоматично, коли об’єкт виходить з області видимості:
1. для локальних об’єктів - при виході з блоку, в якому він оголошений;
2. для глобальних - як частина процедури виходу з таіп();
3. для об’єктів, заданих через покажчики, деструктор викликається неявно при використанні операції Меіе.
Деструктор може виконувати і деякі інші дії, наприклад, виведення остаточних значень елементів-даних класу, що буває зручно при відлагодженні програми. Проте найчастіше ця функція нічого не робить, що характерно для більшості деструкторів:
~Сіа55Мате(){}
Деструктори - антиподи конструкторів. Те, що було створено конструктором, має бути знищено деструктором. Зазвичай, деструктор знищує динамічні змінні, на які посилаються елементи-дані об'єктів класу. Приміром, організація деструктора для знищення рядка, що зберігається в об'єкті класу протягом всього життєвого циклу екземпляру, може бути таким: с1азз Ехатр1е {
рг^аЬе:
сЬаг *йЬз ; риЬ1іс:
Ехатр1е()
{
йЬз=пем(сЬаг[8]); йЬз="Ехатр1е";
соиЬ << "СгеаЬіпд оЬ^есЬ [" << йЬз << "]\п";
~Ехатр1е() // реалізація деструктора
{
соиї << "Бе1е'Ьіпд оЬіесЬ [" << йЬз << "]\п";
Йе1е£е йЬз;
}
};
іп£ таіп()
{
Ехатр1е а1;
ге'Ьигп 0;
}
С++ викликає деструктор, коли об'єкт класу виходить з області видимості, або коли він знищується. Якщо функція-деструктор не містить ніяких дій, немає особливої необхідності її створювати. Як тільки змінна типу клас припиняє існування, виділена для об’єкту пам’ять звільняється автоматично. Це є можливим тому, що у випадку, якщо ми не визначаємо деструктор у програмі, компілятор генерує деструктор по замовчуванню.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
