logo

Deštruktory v C++

Č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:

  1. funkcia končí
  2. program končí
  3. končí blok obsahujúci lokálne premenné
  4. 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