logo

Destruktörer i C++

Vad är en förstörare?

Destructor är en instansmedlemsfunktion som anropas automatiskt när ett objekt ska förstöras. Det betyder att en destruktor är den sista funktionen som kommer att anropas innan ett objekt förstörs.

  • En destruktor är också en speciell medlemsfunktion som en konstruktör. Destructor förstör klassobjekten som skapats av konstruktorn.
  • Destructor har samma namn som deras klassnamn föregås av en tilde (~) symbol.
  • Det är inte möjligt att definiera mer än en förstörare.
  • Destruktorn är bara ett sätt att förstöra objektet som skapats av konstruktören. Därför kan destruktorn inte överbelastas.
  • Destructor varken kräver något argument eller returnerar något värde.
  • Det anropas automatiskt när ett objekt går utanför räckvidden.
  • Destructor frigör minnesutrymme som upptas av objekten som skapats av konstruktorn.
  • I destructor förstörs objekt på motsatt sida av ett objektskapande.

Saken ska noteras här om objektet skapas genom att använda new eller konstruktorn använder nytt för att allokera minne som finns i heapminnet eller det fria lagret, ska destruktorn använda delete för att frigöra minnet.

Syntax

Syntaxen för att definiera destruktorn inom klassen:

~ () { // some instructions }>

Syntaxen för att definiera destruktorn utanför klassen:

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

Exempel 1

Koden nedan visar den automatiska exekveringen av konstruktörer och destruktorer när objekt skapas respektive förstörs.

C++

java strängbyggare




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

>

>

Produktion

 Constructor executed Destructor executed>

Exempel 2

Koden nedan visar den automatiska exekveringen av konstruktörer och destruktorer varje gång när flera objekt skapas respektive förstörs.

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

>

>

Produktion

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

Exempel 3

C++-programmet nedan visar hur många gånger konstruktörer och destruktörer anropas.

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

>

>

Produktion

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>

Notera: Objekt förstörs i omvänd ordning av deras skapelse. I det här fallet är t3 den första som förstörs, medan t är den sista.

Egenskaper för Destructor

Följande är de viktigaste egenskaperna hos Destructor:

  • Destructor-funktionen anropas automatiskt när objekten förstörs.
  • Den kan inte deklareras statisk eller const.
  • Förstöraren har inga argument.
  • Den har ingen returtyp, inte ens ogiltig.
  • Ett objekt i en klass med en Destructor kan inte bli medlem i facket.
  • En förstörare bör deklareras i den offentliga delen av klassen.
  • Programmeraren kan inte komma åt adressen till förstöraren.

När kallas destruktören?

En destruktorfunktion anropas automatiskt när objektet hamnar utanför räckvidden:

  1. funktionen avslutas
  2. programmet slutar
  3. ett block som innehåller lokala variabler slutar
  4. en raderingsoperatör anropas

Notera: jagare kan också kallas explicit för ett objekt.

Hur kallar man destruktörer uttryckligen?

Vi kan kalla destruktörerna uttryckligen genom att använda följande uttalande:

object_name.~class_name()>

Hur skiljer sig förstörare från normala medlemsfunktioner?

  • Destruktörer har samma namn som klassen föregås av en tilde (~)
  • Destruktörer tar inga argument och lämnar inte tillbaka något

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

>

Java förbättrad loop

>

Kan det finnas mer än en destruktör i en klass?

Nej, det kan bara finnas en destruktor i en klass med ett klassnamn som föregås av ~, inga parametrar och ingen returtyp.

När behöver vi skriva en användardefinierad destruktor?

Om vi ​​inte skriver vår egen destruktor i klassen, skapar kompilatorn en standarddestruktor för oss. Standarddestruktorn fungerar bra om vi inte har dynamiskt allokerat minne eller pekare i klassen. När en klass innehåller en pekare till minne som är allokerat i klassen, bör vi skriva en destruktor för att frigöra minne innan klassinstansen förstörs. Detta måste göras för att undvika minnesläckor.

Kan en destruktör vara virtuell?

Ja, det är faktiskt alltid en bra idé att göra destruktörer virtuella i basklassen när vi har en virtuell funktion. Se virtuell destruktor för mer information.

Du kanske vill göra en frågesport om destruktörer.

relaterade artiklar