logo

Iznīcinātāji valodā C++

Kas ir destruktors?

Destruktors ir instances dalībnieka funkcija, kas tiek izsaukta automātiski ikreiz, kad objekts tiks iznīcināts. Tas nozīmē, ka iznīcinātājs ir pēdējā funkcija, kas tiks izsaukta pirms objekta iznīcināšanas.

  • Destruktors ir arī īpaša dalībnieka funkcija, piemēram, konstruktors. Destruktors iznīcina konstruktora izveidotos klases objektus.
  • Destruktoram ir tāds pats nosaukums kā klases nosaukumam, pirms kura ir tildes (~) simbols.
  • Nav iespējams definēt vairāk kā vienu destruktoru.
  • Destruktors ir tikai viens veids, kā iznīcināt konstruktora radīto objektu. Tādējādi destruktoru nevar pārslogot.
  • Destructor neprasa nekādus argumentus un neatgriež nekādu vērtību.
  • Tas tiek automātiski izsaukts, kad objekts iziet ārpus darbības jomas.
  • Destruktors atbrīvo atmiņas vietu, ko aizņem konstruktora izveidotie objekti.
  • Destruktorā objekti tiek iznīcināti objekta izveides otrādi.

Šeit ir jāatzīmē, ja objekts ir izveidots, izmantojot jaunu vai konstruktors izmanto jaunu, lai piešķirtu atmiņu, kas atrodas kaudzes atmiņā vai brīvajā veikalā, destruktoram ir jāizmanto dzēšana, lai atbrīvotu atmiņu.

Sintakse

Sintakse destruktora definēšanai klasē:

~ () { // some instructions }>

Sintakse destruktora definēšanai ārpus klases:

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

1. piemērs

Zemāk redzamais kods demonstrē konstruktoru un iznīcinātāju automātisku izpildi, attiecīgi izveidojot un iznīcinot objektus.

C++

abstraktā klase




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

>

>

Izvade

 Constructor executed Destructor executed>

2. piemērs

Tālāk esošais kods demonstrē konstruktoru un iznīcinātāju automātisku izpildi katru reizi, kad attiecīgi tiek izveidoti un iznīcināti vairāki objekti.

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

>

>

Izvade

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

3. piemērs

Zemāk esošā C++ programma parāda konstruktoru un destruktoru izsaukšanas reižu skaitu.

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

>

>

Izvade

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>

Piezīme: Objekti tiek iznīcināti apgrieztā secībā to radīšanai. Šajā gadījumā t3 ir pirmais, kas tiek iznīcināts, bet t ir pēdējais.

Destruktora īpašības

Šīs ir galvenās Destructor īpašības:

  • Destruktora funkcija tiek automātiski izsaukta, kad objekti tiek iznīcināti.
  • To nevar pasludināt par statisku vai pastāvīgu.
  • Destruktoram nav argumentu.
  • Tam nav atgriešanas veida, un tas pat nav spēkā esošs.
  • Klases objekts ar Destruktoru nevar kļūt par savienības biedru.
  • Iznīcinātājs ir jādeklarē klases publiskajā sadaļā.
  • Programmētājs nevar piekļūt iznīcinātāja adresei.

Kad tiek izsaukts iznīcinātājs?

Destruktora funkcija tiek izsaukta automātiski, kad objekts ir ārpus darbības jomas:

  1. funkcija beidzas
  2. programma beidzas
  3. beidzas bloks, kurā ir lokāli mainīgie
  4. tiek izsaukts dzēšanas operators

Piezīme: iznīcinātājs var saukt arī tieši objektam.

Kā skaidri nosaukt iznīcinātājus?

Mēs varam skaidri izsaukt iznīcinātājus, izmantojot šādu paziņojumu:

object_name.~class_name()>

Kā iznīcinātāji atšķiras no parastajām dalībnieku funkcijām?

  • Destruktoriem ir tāds pats nosaukums kā klasei, pirms kuras ir tilde (~)
  • Iznīcinātāji nepieņem nekādus argumentus un neko neatdod

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

ātrā šķirošana
>

>

Vai klasē var būt vairāk nekā viens iznīcinātājs?

Nē, klasē var būt tikai viens destruktors ar klases nosaukumu, pirms kura ir ~, bez parametriem un bez atgriešanas veida.

Kad mums ir jāraksta lietotāja definēts iznīcinātājs?

Ja klasē neierakstām paši savu iznīcinātāju, kompilators mums izveido noklusējuma destruktoru. Noklusējuma iznīcinātājs darbojas labi, ja vien mums nav dinamiski piešķirta atmiņa vai rādītājs klasē. Ja klasē ir rādītājs uz klasē piešķirto atmiņu, mums ir jāraksta destruktors, lai atbrīvotu atmiņu, pirms klases gadījums tiek iznīcināts. Tas jādara, lai izvairītos no atmiņas noplūdēm.

Vai iznīcinātājs var būt virtuāls?

Jā, patiesībā vienmēr ir laba ideja padarīt destruktorus virtuālus bāzes klasē, ja mums ir virtuāla funkcija. Plašāku informāciju skatiet virtuālajā destruktorā.

Iespējams, vēlēsities aizpildīt viktorīnu par iznīcinātājiem.

Saistītie raksti