Kaj je destruktor?
Destructor je funkcija člana primerka, ki se samodejno prikliče vsakič, ko bo predmet uničen. To pomeni, da je destruktor zadnja funkcija, ki bo poklicana, preden bo objekt uničen.
- Destruktor je prav tako posebna funkcija člana kot konstruktor. Destructor uniči objekte razreda, ki jih je ustvaril konstruktor.
- Destructor ima isto ime kot ime razreda, pred katerim je simbol tilde (~).
- Ni mogoče definirati več kot enega destruktorja.
- Destruktor je le eden od načinov za uničenje predmeta, ki ga je ustvaril konstruktor. Zato destruktorja ni mogoče preobremeniti.
- Destructor ne zahteva nobenega argumenta niti ne vrne nobene vrednosti.
- Samodejno se pokliče, ko gre objekt izven obsega.
- Destructor sprosti pomnilniški prostor, ki ga zasedajo objekti, ki jih je ustvaril konstruktor.
- V destructorju se objekti uničijo v obratni smeri kot je bil objekt ustvarjen.
Tukaj je treba opozoriti, da če je objekt ustvarjen z uporabo new ali konstruktor uporablja new za dodelitev pomnilnika, ki se nahaja v pomnilniku kopice ali prosti shrambi, mora destruktor uporabiti delete, da sprosti pomnilnik.
Sintaksa
Sintaksa za definiranje destruktorja znotraj razreda:
~ () { // some instructions }> Sintaksa za definiranje destruktorja zunaj razreda:
:: ~() { // some instructions }> Primer 1
Spodnja koda prikazuje samodejno izvajanje konstruktorjev in destruktorjev, ko so objekti ustvarjeni oziroma uničeni.
C++
kaj so velike in male črke v sql
// 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;> }> |
>
>Izhod
Constructor executed Destructor executed>
Primer 2
Spodnja koda prikazuje samodejno izvajanje konstruktorjev in destruktorjev vsakič, ko je ustvarjenih oziroma uničenih več predmetov.
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;> }> |
>
>Izhod
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
Primer 3
Spodnji program C++ prikazuje, kolikokrat so klicani konstruktorji in destruktorji.
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;> }> |
>
moj živi čriček
>
Izhod
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>
Opomba: Predmeti se uničujejo v obratnem vrstnem redu, kot so jih ustvarili. V tem primeru je t3 prvi uničen, t pa zadnji.
Lastnosti Destructorja
Glavne lastnosti Destructorja so naslednje:
- Funkcija destructor se samodejno prikliče, ko so predmeti uničeni.
- Ni ga mogoče razglasiti za statičnega ali konstantnega.
- Destruktor nima argumentov.
- Nima povratnega tipa, niti void.
- Objekt razreda z Destructorjem ne more postati član unije.
- Destruktor je treba deklarirati v javnem delu razreda.
- Programer ne more dostopati do naslova destruktorja.
Kdaj se pokliče destruktor?
Funkcija destruktorja se samodejno pokliče, ko gre objekt izven obsega:
- funkcija se konča
- program se konča
- blok, ki vsebuje lokalne spremenljivke, se konča
- pokliče se operater brisanja
Opomba: rušilec lahko tudi eksplicitno kličete za objekt.
Kako eksplicitno poklicati destruktorje?
Destruktorje lahko eksplicitno pokličemo z naslednjim stavkom:
object_name.~class_name()>
Kako se destruktorji razlikujejo od običajnih članskih funkcij?
- Destruktorji imajo isto ime kot razred, pred katerim je tilda (~)
- Destruktorji ne sprejmejo nobenega argumenta in ne vrnejo ničesar
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;> }> |
>
>
Ali je lahko v razredu več kot en destruktor?
Ne, v razredu je lahko samo en destruktor z imenom razreda, pred katerim je ~, brez parametrov in brez vrste povratka.
Kdaj moramo napisati uporabniško definiran destruktor?
Če v razredu ne napišemo lastnega destruktorja, nam prevajalnik ustvari privzeti destruktor. Privzeti destruktor deluje dobro, razen če imamo dinamično dodeljen pomnilnik ali kazalec v razredu. Ko razred vsebuje kazalec na pomnilnik, dodeljen v razredu, bi morali napisati destruktor za sprostitev pomnilnika, preden je primerek razreda uničen. To je treba storiti, da preprečite puščanje pomnilnika.
Ali je lahko destruktor virtualen?
Da, pravzaprav je vedno dobra ideja narediti destruktorje virtualne v osnovnem razredu, ko imamo virtualno funkcijo. Za več podrobnosti glejte virtualni destruktor.
Morda boste radi rešili kviz o destruktorjih.
povezani članki
- Konstruktorji v C++
- Virtualni uničevalec
- Čisti virtualni destruktor v C++