logo

Destruktorit C++:ssa

Mikä on tuhoaja?

Destructor on ilmentymän jäsentoiminto, joka käynnistyy automaattisesti aina, kun objekti aiotaan tuhota. Tämä tarkoittaa, että tuhoaja on viimeinen toiminto, jota kutsutaan ennen kuin objekti tuhoutuu.

  • Destruktori on myös erityinen jäsenfunktio, kuten konstruktori. Destructor tuhoaa rakentajan luomat luokkaobjektit.
  • Destructorilla on sama nimi kuin niiden luokan nimellä, jota edeltää tilde (~) -symboli.
  • Ei ole mahdollista määritellä useampaa kuin yhtä tuhoajaa.
  • Tuhoaja on vain yksi tapa tuhota rakentajan luoma esine. Siksi tuhoajaa ei voida ylikuormittaa.
  • Destructor ei vaadi argumentteja eikä palauta arvoa.
  • Sitä kutsutaan automaattisesti, kun objekti menee soveltamisalan ulkopuolelle.
  • Destructor vapauttaa rakentajan luomien objektien käyttämää muistitilaa.
  • Destruktorissa esineet tuhotaan objektin luomisen käänteisessä järjestyksessä.

Tässä on huomioitava, jos objekti luodaan käyttämällä uutta tai rakentaja käyttää uutta varatakseen keon muistissa tai vapaassa varastossa olevaa muistia, destruktorin tulee vapauttaa muisti käyttämällä deleteä.

Syntaksi

Syntaksi destruktorin määrittämiseksi luokassa:

~ () { // some instructions }>

Syntaksi destruktorin määrittämiseksi luokan ulkopuolella:

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

Esimerkki 1

Alla oleva koodi osoittaa rakentajien ja tuhoajien automaattisen suorittamisen, kun objekteja luodaan ja vastaavasti tuhotaan.

C++

postitilauksen läpikulku




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

>

>

Lähtö

 Constructor executed Destructor executed>

Esimerkki 2

Alla oleva koodi näyttää rakentajien ja tuhoajien automaattisen suorituksen joka kerta, kun useita objekteja luodaan ja vastaavasti tuhotaan.

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

>

>

Lähtö

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

Esimerkki 3

Alla oleva C++-ohjelma näyttää kuinka monta kertaa konstruktoreita ja destruktoreita kutsutaan.

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

>

>

Lähtö

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>

Huomautus: Esineet tuhotaan päinvastaisessa järjestyksessä kuin ne on luotu. Tässä tapauksessa t3 on ensimmäinen tuhottava, kun taas t on viimeinen.

Destructorin ominaisuudet

Seuraavat ovat Destructorin pääominaisuudet:

  • Destructor-toiminto käynnistyy automaattisesti, kun esineet tuhoutuvat.
  • Sitä ei voida julistaa staattiseksi tai vakioksi.
  • Tuhoajalla ei ole argumentteja.
  • Sillä ei ole palautustyyppiä, ei edes mitätöntä.
  • Luokan esine, jolla on Destructor, ei voi tulla liiton jäseneksi.
  • Tuhoaja tulee ilmoittaa luokan julkisessa osiossa.
  • Ohjelmoija ei voi käyttää tuhoajan osoitetta.

Milloin tuhoaja kutsutaan?

Destruktor-funktiota kutsutaan automaattisesti, kun objekti menee soveltamisalan ulkopuolelle:

arraylist java
  1. toiminto päättyy
  2. ohjelma päättyy
  3. paikallisia muuttujia sisältävä lohko päättyy
  4. kutsutaan poisto-operaattoria

Huomautus: hävittäjä voidaan kutsua myös eksplisiittisesti objektille.

Kuinka kutsua tuhoajia selkeästi?

Voimme kutsua tuhoajia eksplisiittisesti käyttämällä seuraavaa lausetta:

object_name.~class_name()>

Miten tuhoajat eroavat normaaleista jäsenfunktioista?

  • Destruktoreilla on sama nimi kuin luokalla, jota edeltää aaltoviiva (~)
  • Tuhoajat eivät ota vastaan ​​mitään väitteitä eivätkä palauta mitään

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

>

>

Voiko luokassa olla useampi kuin yksi tuhoaja?

Ei, luokassa voi olla vain yksi tuhoaja, jonka luokan nimen edessä on ~, ei parametreja eikä palautustyyppiä.

Milloin meidän on kirjoitettava käyttäjän määrittelemä tuhoaja?

Jos emme kirjoita luokassa omaa tuhoajaamme, kääntäjä luo meille oletusdestruktorin. Oletushävittäjä toimii hyvin, ellemme ole varannut dynaamisesti muistia tai osoitinta luokassa. Kun luokka sisältää osoittimen luokassa varattuun muistiin, meidän tulee kirjoittaa tuhoaja, joka vapauttaa muistin ennen kuin luokkainstanssi tuhoutuu. Tämä on tehtävä muistivuotojen välttämiseksi.

Voiko tuhoaja olla virtuaalinen?

Kyllä, itse asiassa on aina hyvä idea tehdä destruktoreista virtuaalisia perusluokassa, kun meillä on virtuaalinen funktio. Katso lisätietoja virtuaalihävittäjästä.

Saatat haluta vastata tietokilpailuun tuhoajista.

Aiheeseen liittyvät artikkelit