Деструктор в об’єктно-орієнтованому програмуванні — спеціальний метод класу, який викликається автоматично при знищенні об'єкта і призначений для його деініціалізації (наприклад: звільнення ресурсів — пам'яті, закриття файлів тощо).
Виклик деструктора
Виклик деструктора для об'єкта здійснюється, коли при виконанні програми відбувається вихід за рамки області видимості цього об'єкта і його життєвий цикл завершується, або коли об'єкт пов'язаний з іншим об'єктом, який перестає існувати, або коли пам'ять під об'єкт (динамічно виділяється) вивільняється в явному вигляді, або прямим викликом деструктора для вивільнення ресурсів об'єкта без вивільнення пам'яті, в якій знаходиться об'єкт.
У мовах програмування, в яких існує механізм автоматичного прибирання сміття, складно детерміновано забезпечити можливість виклику деструктора, тому ці мови, як правило, вважаються не сумісними із програмною ідіомою RAII. В таких мовах, звільнення об'єкта і пов'язаних з ним ресурсів повинно виконуватись за допомогою явного виклику відповідної функції (які в коді зазвичай називаються ). Цей метод рекомендується для вивільнення ресурсів замість використання для цього фіналізатора.
Призначення деструктора
Призначення деструктора — вивільняти стан об'єкта шляхом вивільнення ресурсів, що використовувались об'єктом, як-то: вивільнення пам'яті, закриття файлів, закриття мережевих з'єднань, відправлення повідомлень іншим об'єктам тощо.
Синтаксис деструктора
- C++ має правило іменування, за яким деструктори мають таке саме ім'я що і клас, в якому вони оголошені, але починаються з префіксу тильда (~). Деструктор в C++ не має типу та не має аргументів (окрім покажчика this, який передається неявно). Деструктори не успадковуються, але можуть бути віртуальними.
- В Object Pascal, оголошення деструктора містить ключове слово "
destructor
" і може мати визначене користувачем ім’я (але зазвичай їх називають словом "Destroy"). - В Perl, метод деструктор називається DESTROY.
- В для Perl, метод деструктор називається DEMOLISH.
- В Objective-C, метод деструктор називається "
dealloc
". - В Swift, метод деструктор називається "
deinit
". - В PHP 5, метод деструктор називається "
__destruct
". В попередніх версіях PHP не існувало деструкторів. - В Python декструктор описується в магічному методі
__del__
, але через наявність механізму збирання сміття, його виклик не може бути керований з програми.
C++
В C++ деструктор не може приймати аргументів. В прикладі деструктор вивільняє пам'ять, виділену конструктором.
Деструктор має те саме ім'я, що і клас, але зі знаком тильда (~), що вказаний перед ним. Якщо об'єкт був створений як , його деструктор викликається автоматично, як тільки виконання програми виходить за межі області видимості. Якщо об'єкт було створено за допомогою виразу , тоді деструктор буде викликано після явного виклику оператора із вказанням вказівника на об'єкт. Зазвичай, ця операція виконуються в рамках іншого деструктора, наприклад, в деструкторі об'єкту розумного вказівника.
В ієрархіях наслідування, декларація віртуального деструктора в базовому класі гарантує, що деструктори похідних класів будуть викликані належним чином саме для тих об'єктів, на які вказує покажчик (тип покажчика при цьому може відрізнятись від типу об'єкта, на який вказує покажчик, наприклад — коли об'єкт видаляється через вказівник на базовий тип класу). Об'єкти, які вивільняються таким чином повинні містити віртуальний деструктор.
Деструктор не повинен генерувати виключних ситуацій.
Приклад:
class Foo { public: // Типовий конструктор Foo(const char *name) { m_len = strlen(name); m_name = new char[m_len+1]; strcpy(name, m_name); m_name[m_len] = '\0'; } // Деструктор ~Foo() { delete [] m_name; } private: int m_len; char *m_name; };
Посилання
- Гради Буч. Объектно-ориентированный анализ и проектирование // Классы и объекты [ 1 грудня 2009 у Wayback Machine.]
Примітки
- Constructors and Destructors [ 18 січня 2018 у Wayback Machine.], from PHP online documentation
- . python.org. The Python Software Foundation. Архів оригіналу за 10 березня 2016. Процитовано 11 березня 2016.
- GotW #47: Uncaught exceptions [ 29 листопада 2014 у Wayback Machine.] Accessed 31 July 2011
Див. також
Це незавершена стаття про мови програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Destruktor v ob yektno oriyentovanomu programuvanni specialnij metod klasu yakij viklikayetsya avtomatichno pri znishenni ob yekta i priznachenij dlya jogo deinicializaciyi napriklad zvilnennya resursiv pam yati zakrittya fajliv tosho Viklik destruktoraViklik destruktora dlya ob yekta zdijsnyuyetsya koli pri vikonanni programi vidbuvayetsya vihid za ramki oblasti vidimosti cogo ob yekta i jogo zhittyevij cikl zavershuyetsya abo koli ob yekt pov yazanij z inshim ob yektom yakij perestaye isnuvati abo koli pam yat pid ob yekt dinamichno vidilyayetsya vivilnyayetsya v yavnomu viglyadi abo pryamim viklikom destruktora dlya vivilnennya resursiv ob yekta bez vivilnennya pam yati v yakij znahoditsya ob yekt U movah programuvannya v yakih isnuye mehanizm avtomatichnogo pribirannya smittya skladno determinovano zabezpechiti mozhlivist vikliku destruktora tomu ci movi yak pravilo vvazhayutsya ne sumisnimi iz programnoyu idiomoyu RAII V takih movah zvilnennya ob yekta i pov yazanih z nim resursiv povinno vikonuvatis za dopomogoyu yavnogo vikliku vidpovidnoyi funkciyi yaki v kodi zazvichaj nazivayutsya Cej metod rekomenduyetsya dlya vivilnennya resursiv zamist vikoristannya dlya cogo finalizatora Priznachennya destruktoraPriznachennya destruktora vivilnyati stan ob yekta shlyahom vivilnennya resursiv sho vikoristovuvalis ob yektom yak to vivilnennya pam yati zakrittya fajliv zakrittya merezhevih z yednan vidpravlennya povidomlen inshim ob yektam tosho Sintaksis destruktoraC maye pravilo imenuvannya za yakim destruktori mayut take same im ya sho i klas v yakomu voni ogolosheni ale pochinayutsya z prefiksu tilda Destruktor v C ne maye tipu ta ne maye argumentiv okrim pokazhchika this yakij peredayetsya neyavno Destruktori ne uspadkovuyutsya ale mozhut buti virtualnimi V Object Pascal ogoloshennya destruktora mistit klyuchove slovo destructor i mozhe mati viznachene koristuvachem im ya ale zazvichaj yih nazivayut slovom Destroy V Perl metod destruktor nazivayetsya DESTROY V dlya Perl metod destruktor nazivayetsya DEMOLISH V Objective C metod destruktor nazivayetsya dealloc V Swift metod destruktor nazivayetsya deinit V PHP 5 metod destruktor nazivayetsya destruct V poperednih versiyah PHP ne isnuvalo destruktoriv V Python dekstruktor opisuyetsya v magichnomu metodi del ale cherez nayavnist mehanizmu zbirannya smittya jogo viklik ne mozhe buti kerovanij z programi C V C destruktor ne mozhe prijmati argumentiv V prikladi destruktor vivilnyaye pam yat vidilenu konstruktorom Destruktor maye te same im ya sho i klas ale zi znakom tilda sho vkazanij pered nim Yaksho ob yekt buv stvorenij yak jogo destruktor viklikayetsya avtomatichno yak tilki vikonannya programi vihodit za mezhi oblasti vidimosti Yaksho ob yekt bulo stvoreno za dopomogoyu virazu new todi destruktor bude viklikano pislya yavnogo vikliku operatora delete iz vkazannyam vkazivnika na ob yekt Zazvichaj cya operaciya vikonuyutsya v ramkah inshogo destruktora napriklad v destruktori ob yektu rozumnogo vkazivnika V iyerarhiyah nasliduvannya deklaraciya virtualnogo destruktora v bazovomu klasi garantuye sho destruktori pohidnih klasiv budut viklikani nalezhnim chinom same dlya tih ob yektiv na yaki vkazuye pokazhchik tip pokazhchika pri comu mozhe vidriznyatis vid tipu ob yekta na yakij vkazuye pokazhchik napriklad koli ob yekt vidalyayetsya cherez vkazivnik na bazovij tip klasu Ob yekti yaki vivilnyayutsya takim chinom povinni mistiti virtualnij destruktor Destruktor ne povinen generuvati viklyuchnih situacij Priklad class Foo public Tipovij konstruktor Foo const char name m len strlen name m name new char m len 1 strcpy name m name m name m len 0 Destruktor Foo delete m name private int m len char m name PosilannyaGradi Buch Obektno orientirovannyj analiz i proektirovanie Klassy i obekty 1 grudnya 2009 u Wayback Machine PrimitkiConstructors and Destructors 18 sichnya 2018 u Wayback Machine from PHP online documentation python org The Python Software Foundation Arhiv originalu za 10 bereznya 2016 Procitovano 11 bereznya 2016 GotW 47 Uncaught exceptions 29 listopada 2014 u Wayback Machine Accessed 31 July 2011Div takozhKonstruktor programuvannya Ce nezavershena stattya pro movi programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi