logo

Destruktorer i C++

Hvad er en destruktor?

Destructor er en instansmedlemsfunktion, der aktiveres automatisk, når et objekt skal ødelægges. Det betyder, at en destruktor er den sidste funktion, der vil blive kaldt, før et objekt bliver ødelagt.

  • En destruktor er også en særlig medlemsfunktion ligesom en konstruktør. Destructor ødelægger klasseobjekterne skabt af konstruktøren.
  • Destructor har samme navn som deres klassenavn efterfulgt af et tilde (~) symbol.
  • Det er ikke muligt at definere mere end én destruktor.
  • Destruktoren er kun én måde at ødelægge objektet skabt af konstruktøren. Destruktoren kan derfor ikke overbelastes.
  • Destructor hverken kræver noget argument eller returnerer nogen værdi.
  • Det kaldes automatisk, når et objekt går uden for rækkevidde.
  • Destruktoren frigiver hukommelsesplads optaget af de objekter, der er oprettet af konstruktøren.
  • I destructor ødelægges objekter i det modsatte af en objektskabelse.

Sagen skal bemærkes her, hvis objektet er oprettet ved at bruge new eller konstruktøren bruger new til at allokere hukommelse, der ligger i heap-hukommelsen eller det frie lager, skal destruktoren bruge delete for at frigøre hukommelsen.

Syntaks

Syntaksen til at definere destruktoren i klassen:

~ () { // some instructions }>

Syntaksen til at definere destruktoren uden for klassen:

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

Eksempel 1

Nedenstående kode demonstrerer den automatiske udførelse af konstruktører og destruktorer, når objekter henholdsvis oprettes og ødelægges.

C++

chown kommando




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

Eksempel 2

Nedenstående kode demonstrerer den automatiske udførelse af konstruktører og destruktorer hver gang, når flere objekter henholdsvis oprettes og ødelægges.

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>

Eksempel 3

Nedenstående C++-program viser antallet af gange, der kaldes konstruktører og destruktorer.

document.queryselector

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>

Bemærk: Objekter ødelægges i omvendt rækkefølge af deres oprettelse. I dette tilfælde er t3 den første, der bliver ødelagt, mens t er den sidste.

Destructors egenskaber

Følgende er de vigtigste egenskaber ved Destructor:

  • Destructor-funktionen aktiveres automatisk, når objekterne ødelægges.
  • Det kan ikke erklæres statisk eller konst.
  • Destruktoren har ingen argumenter.
  • Den har ingen returtype, ikke engang ugyldig.
  • Et objekt i en klasse med en Destructor kan ikke blive medlem af fagforeningen.
  • En destruktor bør erklæres i den offentlige del af klassen.
  • Programmøren kan ikke få adgang til adressen på destruktoren.

Hvornår kaldes destruktoren?

En destruktorfunktion kaldes automatisk, når objektet går uden for rækkevidde:

  1. funktionen slutter
  2. programmet slutter
  3. en blok, der indeholder lokale variabler, slutter
  4. en slette-operatør kaldes

Bemærk: destroyer kan også kaldes eksplicit for et objekt.

Hvordan kalder man destruktorer eksplicit?

Vi kan kalde destruktørerne eksplicit ved at bruge følgende udsagn:

object_name.~class_name()>

Hvordan adskiller destruktorer sig fra normale medlemsfunktioner?

  • Destruktorer har samme navn som klassen med en tilde (~) foran.
  • Destruktorer tager ikke noget argument og returnerer ikke noget

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 der være mere end én destruktor i en klasse?

Nej, der kan kun være én destruktor i en klasse med et klassenavn efter ~, ingen parametre og ingen returtype.

Hvornår skal vi skrive en brugerdefineret destruktor?

Hvis vi ikke skriver vores egen destructor i klassen, opretter compileren en standard destructor for os. Standarddestruktoren fungerer fint, medmindre vi har dynamisk allokeret hukommelse eller pointer i klassen. Når en klasse indeholder en pointer til hukommelse, der er allokeret i klassen, bør vi skrive en destruktor for at frigive hukommelse, før klasseforekomsten ødelægges. Dette skal gøres for at undgå hukommelseslækager.

Kan en destruktor være virtuel?

Ja, faktisk er det altid en god idé at gøre destruktorer virtuelle i basisklassen, når vi har en virtuel funktion. Se virtual destructor for flere detaljer.

Du må gerne tage en quiz om destruktorer.

relaterede artikler