logo

Destructors in C++

Wat is een vernietiger?

Destructor is een instantielidfunctie die automatisch wordt aangeroepen wanneer een object wordt vernietigd. Dit betekent dat een destructor de laatste functie is die wordt aangeroepen voordat een object wordt vernietigd.

  • Een destructor is ook een speciale lidfunctie, zoals een constructor. Destructor vernietigt de klasseobjecten die door de constructor zijn gemaakt.
  • Destructor heeft dezelfde naam als hun klassenaam, voorafgegaan door een tilde (~) symbool.
  • Het is niet mogelijk om meer dan één destructor te definiëren.
  • De destructor is slechts één manier om het door de constructor gemaakte object te vernietigen. Daarom kan de destructor niet overbelast worden.
  • Destructor vereist geen enkel argument en retourneert geen enkele waarde.
  • Het wordt automatisch aangeroepen wanneer een object buiten bereik raakt.
  • Destructor maakt geheugenruimte vrij die wordt ingenomen door de objecten die door de constructor zijn gemaakt.
  • In destructor worden objecten vernietigd in het omgekeerde van het maken van objecten.

Het ding moet hier worden opgemerkt: als het object wordt gemaakt met behulp van new of als de constructor new gebruikt om geheugen toe te wijzen dat zich in het heap-geheugen of de vrije opslag bevindt, moet de destructor delete gebruiken om het geheugen vrij te maken.

Syntaxis

De syntaxis voor het definiëren van de destructor binnen de klasse:

~ () { // some instructions }>

De syntaxis voor het definiëren van de destructor buiten de klasse:

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

voorbeeld 1

De onderstaande code demonstreert de automatische uitvoering van constructors en destructors wanneer objecten respectievelijk worden gemaakt en vernietigd.

C++

int naar string c++




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

>

>

Uitvoer

 Constructor executed Destructor executed>

Voorbeeld 2

De onderstaande code demonstreert de automatische uitvoering van constructors en destructors telkens wanneer meerdere objecten respectievelijk worden gemaakt en vernietigd.

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

>

>

Uitvoer

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

Voorbeeld 3

Het onderstaande C++-programma demonstreert het aantal keren dat constructors en destructors worden aangeroepen.

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

>

>

Uitvoer

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>

Opmerking: Objecten worden vernietigd in de omgekeerde volgorde van hun creatie. In dit geval is t3 de eerste die wordt vernietigd, terwijl t de laatste is.

Eigenschappen van Destructor

Dit zijn de belangrijkste eigenschappen van Destructor:

  • De destructorfunctie wordt automatisch geactiveerd wanneer de objecten worden vernietigd.
  • Het kan niet statisch of constant worden verklaard.
  • De destructor heeft geen argumenten.
  • Het heeft geen retourtype, zelfs niet ongeldig.
  • Een object van een klasse met een Destructor kan geen lid worden van de vakbond.
  • Een destructor moet worden gedeclareerd in het openbare gedeelte van de klasse.
  • De programmeur heeft geen toegang tot het adres van de destructor.

Wanneer wordt de destructor gebeld?

Er wordt automatisch een destructorfunctie aangeroepen wanneer het object buiten bereik valt:

  1. de functie eindigt
  2. het programma eindigt
  3. een blok met lokale variabelen eindigt
  4. er wordt een verwijderoperator aangeroepen

Opmerking: torpedojager kan ook expliciet voor een object worden aangeroepen.

Hoe kun je destructors expliciet aanroepen?

We kunnen de destructors expliciet aanroepen met behulp van de volgende verklaring:

json-gegevensvoorbeeld
object_name.~class_name()>

Hoe verschillen destructors van normale ledenfuncties?

  • Destructors hebben dezelfde naam als de klasse, voorafgegaan door een tilde (~)
  • Destructors aanvaarden geen enkel argument en retourneren niets

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

>

>

Kan er meer dan één destructor in een klas zijn?

Nee, er kan slechts één destructor in een klasse voorkomen met een klassenaam voorafgegaan door ~, geen parameters en geen retourtype.

Wanneer moeten we een door de gebruiker gedefinieerde destructor schrijven?

Als we onze eigen destructor niet in de klas schrijven, maakt de compiler een standaarddestructor voor ons. De standaarddestructor werkt prima, tenzij we dynamisch geheugen of aanwijzer in de klas hebben toegewezen. Wanneer een klasse een verwijzing bevat naar het geheugen dat in de klasse is toegewezen, moeten we een destructor schrijven om geheugen vrij te geven voordat de klasse-instantie wordt vernietigd. Dit moet worden gedaan om geheugenlekken te voorkomen.

Kan een destructor virtueel zijn?

Ja, in feite is het altijd een goed idee om destructors virtueel te maken in de basisklasse als we een virtuele functie hebben. Zie virtuele destructor voor meer details.

Misschien vind je het leuk om een ​​quiz te doen over destructors.

gerelateerde artikelen