logo

Destruktory v C++

Co je to destruktor?

Destruktor je členská funkce instance, která je vyvolána automaticky, kdykoli má být objekt zničen. To znamená, že destruktor je poslední funkce, která bude volána před zničením objektu.

  • Destruktor je také speciální členská funkce jako konstruktor. Destruktor ničí objekty třídy vytvořené konstruktorem.
  • Destruktor má stejný název jako název jejich třídy, před kterým je symbol vlnovky (~).
  • Není možné definovat více než jeden destruktor.
  • Destruktor je pouze jeden způsob, jak zničit objekt vytvořený konstruktorem. Destruktor tedy nemůže být přetížen.
  • Destruktor nevyžaduje žádný argument ani nevrací žádnou hodnotu.
  • Volá se automaticky, když objekt překročí rozsah.
  • Destruktor uvolní paměťový prostor obsazený objekty vytvořenými konstruktorem.
  • V destruktoru jsou objekty zničeny v opačném pořadí než při vytváření objektu.

Zde je třeba poznamenat, že pokud je objekt vytvořen pomocí new nebo konstruktor používá new k alokaci paměti, která se nachází v paměti haldy nebo ve volném úložišti, měl by destruktor k uvolnění paměti použít příkaz delete.

Syntax

Syntaxe pro definování destruktoru v rámci třídy:

~ () { // some instructions }>

Syntaxe pro definování destruktoru mimo třídu:

 :: ~() { // some instructions }>

Příklad 1

Níže uvedený kód demonstruje automatické provádění konstruktorů a destruktorů při vytváření a ničení objektů.

C++

weby jako coomeet




// 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ýstup

 Constructor executed Destructor executed>

Příklad 2

Níže uvedený kód demonstruje automatické provádění konstruktorů a destruktorů pokaždé, když je vytvořeno a zničeno více objektů.

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ýstup

 Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>

Příklad 3

Níže uvedený program C++ ukazuje, kolikrát byly volány konstruktory a destruktory.

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;> }>

tring to int
>

>

Výstup

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 jsou ničeny v opačném pořadí, než byly vytvořeny. V tomto případě je t3 zničen jako první, zatímco t je poslední.

Vlastnosti destruktoru

Níže jsou uvedeny hlavní vlastnosti Destructor:

  • Funkce destruktoru se automaticky vyvolá, když jsou objekty zničeny.
  • Nelze jej prohlásit za statický nebo konst.
  • Destruktor nemá argumenty.
  • Nemá návratový typ, dokonce ani void.
  • Objekt třídy s destruktorem se nemůže stát členem unie.
  • Ve veřejné části třídy by měl být deklarován destruktor.
  • Programátor nemá přístup k adrese destruktoru.

Kdy se volá destruktor?

Funkce destruktoru je volána automaticky, když objekt překročí rozsah:

  1. funkce končí
  2. program končí
  3. končí blok obsahující lokální proměnné
  4. volá se operátor delete

Poznámka: ničitel lze také volat explicitně pro objekt.

Jak explicitně volat destruktory?

Destruktory můžeme volat explicitně pomocí následujícího příkazu:

object_name.~class_name()>

Jak se destruktory liší od normálních členských funkcí?

  • Destruktory mají stejný název jako třída, před kterou je vlnovka (~)
  • Destruktory neberou žádný argument a nic nevrací

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 být ve třídě více než jeden destruktor?

Ne, ve třídě může být pouze jeden destruktor s názvem třídy, kterému předchází ~, bez parametrů a bez návratového typu.

Kdy potřebujeme napsat uživatelsky definovaný destruktor?

Pokud ve třídě nenapíšeme vlastní destruktor, kompilátor nám vytvoří výchozí destruktor. Výchozí destruktor funguje dobře, pokud nemáme dynamicky alokovanou paměť nebo ukazatel ve třídě. Když třída obsahuje ukazatel na paměť alokovanou ve třídě, měli bychom napsat destruktor, který uvolní paměť před zničením instance třídy. To je nutné provést, aby se zabránilo úniku paměti.

Může být destruktor virtuální?

Ano, ve skutečnosti je vždy dobrý nápad učinit destruktory virtuálními v základní třídě, když máme virtuální funkci. Viz virtuální destruktor pro více podrobností.

Možná si budete chtít udělat kvíz o destruktorech.

Související články