Čo je to deštruktor?
Deštruktor je členská funkcia inštancie, ktorá sa automaticky vyvolá vždy, keď sa má objekt zničiť. To znamená, že deštruktor je posledná funkcia, ktorá sa zavolá pred zničením objektu.
- Deštruktor je tiež špeciálna členská funkcia ako konštruktor. Deštruktor zničí objekty triedy vytvorené konštruktorom.
- Deštruktor má rovnaký názov ako názov ich triedy, pred ktorým je symbol vlnovky (~).
- Nie je možné definovať viac ako jeden deštruktor.
- Deštruktor je len jedným zo spôsobov, ako zničiť objekt vytvorený konštruktorom. Deštruktor teda nemôže byť preťažený.
- Deštruktor nevyžaduje žiadny argument ani nevracia žiadnu hodnotu.
- Volá sa automaticky, keď objekt prekročí rozsah.
- Deštruktor uvoľní pamäťový priestor obsadený objektmi vytvorenými konštruktorom.
- V deštruktore sú objekty zničené v opačnom poradí ako pri vytváraní objektu.
Tu je potrebné poznamenať, že ak je objekt vytvorený pomocou new alebo konštruktor používa new na alokáciu pamäte, ktorá sa nachádza v halde pamäte alebo vo voľnom úložisku, deštruktor by mal použiť delete na uvoľnenie pamäte.
Syntax
Syntax na definovanie deštruktora v rámci triedy:
~ () { // some instructions }> Syntax na definovanie deštruktora mimo triedy:
:: ~() { // some instructions }> Príklad 1
Nižšie uvedený kód demonštruje automatické vykonávanie konštruktorov a deštruktorov pri vytváraní a ničení objektov.
C++
hlavná metóda java
// 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;> }> |
>
>Výkon
Constructor executed Destructor executed>
Príklad 2
Nižšie uvedený kód demonštruje automatické vykonávanie konštruktorov a deštruktorov zakaždým, keď sa vytvorí a zničí viacero objektov.
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;> }> |
>
>Výkon
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
Príklad 3
Nižšie uvedený program C++ demonštruje počet volaní konštruktérov a deštruktorov.
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;> }> |
>
>
Výkon
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>
Poznámka: Objekty sa ničia v opačnom poradí, ako boli vytvorené. V tomto prípade je t3 ako prvý zničený, zatiaľ čo t je posledný.
Vlastnosti deštruktora
Toto sú hlavné vlastnosti Destructor:
- Funkcia deštruktora sa automaticky vyvolá, keď sú objekty zničené.
- Nemožno ho vyhlásiť za statický alebo konštantný.
- Deštruktor nemá argumenty.
- Nemá návratový typ, dokonca ani prázdny.
- Objekt triedy s deštruktorom sa nemôže stať členom únie.
- Vo verejnej časti triedy by mal byť deklarovaný deštruktor.
- Programátor nemôže získať prístup k adrese deštruktora.
Kedy sa volá deštruktor?
Funkcia deštruktora sa volá automaticky, keď objekt prekročí rozsah:
- funkcia končí
- program končí
- končí blok obsahujúci lokálne premenné
- volá sa operátor vymazania
Poznámka: ničiteľ možno volať aj explicitne pre objekt.
Ako volať deštruktory explicitne?
Deštruktory môžeme volať explicitne pomocou nasledujúceho príkazu:
object_name.~class_name()>
Ako sa deštruktory líšia od bežných členských funkcií?
- Deštruktory majú rovnaký názov ako trieda, pred ktorou je vlnovka (~)
- Deštruktori neberú žiadne argumenty a nič nevracajú
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;> }> |
>
>
Môže byť v triede viac ako jeden deštruktor?
Nie, v triede môže byť iba jeden deštruktor s názvom triedy, ktorému predchádza ~, bez parametrov a bez návratového typu.
Kedy potrebujeme napísať užívateľom definovaný deštruktor?
Ak v triede nenapíšeme vlastný deštruktor, kompilátor nám vytvorí predvolený deštruktor. Predvolený deštruktor funguje dobre, pokiaľ nemáme dynamicky pridelenú pamäť alebo ukazovateľ v triede. Keď trieda obsahuje ukazovateľ na pamäť alokovanú v triede, mali by sme napísať deštruktor na uvoľnenie pamäte pred zničením inštancie triedy. Toto sa musí urobiť, aby sa zabránilo úniku pamäte.
char na reťazec java
Môže byť deštruktor virtuálny?
Áno, v skutočnosti je vždy dobrý nápad urobiť deštruktory virtuálne v základnej triede, keď máme virtuálnu funkciu. Ďalšie podrobnosti nájdete vo virtuálnom deštruktore.
Možno by ste si chceli urobiť kvíz o deštruktoroch.
Súvisiace články
- Konštruktory v C++
- Virtuálny ničiteľ
- Čistý virtuálny deštruktor v C++