logo

Destructors in C++

Què és un destructor?

Destructor és una funció membre de la instància que s'invoca automàticament sempre que un objecte es destrueixi. És a dir, un destructor és l'última funció que es cridarà abans que es destrueixi un objecte.

  • Un destructor també és una funció membre especial com un constructor. Destructor destrueix els objectes de classe creats pel constructor.
  • Destructor té el mateix nom que el nom de la seva classe precedit d'un símbol de tilde (~).
  • No és possible definir més d'un destructor.
  • El destructor és només una manera de destruir l'objecte creat pel constructor. Per tant, el destructor no es pot sobrecarregar.
  • Destructor no requereix cap argument ni retorna cap valor.
  • Es crida automàticament quan un objecte surt de l'abast.
  • El destructor allibera l'espai de memòria ocupat pels objectes creats pel constructor.
  • En el destructor, els objectes es destrueixen al revés de la creació d'un objecte.

Cal tenir en compte aquí si l'objecte es crea utilitzant new o si el constructor utilitza new per assignar memòria que resideix a la memòria del munt o al magatzem lliure, el destructor hauria d'utilitzar delete per alliberar la memòria.

Sintaxi

La sintaxi per definir el destructor dins de la classe:

~ () { // some instructions }>

La sintaxi per definir el destructor fora de la classe:

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

Exemple 1

El codi següent mostra l'execució automàtica de constructors i destructors quan es creen i es destrueixen objectes, respectivament.

C++

np.sum




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

>

>

Sortida

 Constructor executed Destructor executed>

Exemple 2

El codi següent mostra l'execució automàtica de constructors i destructors cada vegada que es creen i es destrueixen diversos objectes, respectivament.

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

>

>

Sortida

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

Exemple 3

El programa C++ següent mostra el nombre de vegades que es criden a constructors i destructors.

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

convertint cadena a int

>

>

Sortida

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>

Nota: Els objectes es destrueixen en l'ordre invers de la seva creació. En aquest cas, t3 és el primer a ser destruït, mentre que t és l'últim.

Propietats del Destructor

Les següents són les principals propietats de Destructor:

  • La funció destructor s'invoca automàticament quan es destrueixen els objectes.
  • No es pot declarar estàtic o const.
  • El destructor no té arguments.
  • No té cap tipus de retorn ni tan sols nul.
  • Un objecte d'una classe amb un Destructor no es pot convertir en membre del sindicat.
  • S'ha de declarar un destructor a la secció pública de la classe.
  • El programador no pot accedir a l'adreça del destructor.

Quan es diu el destructor?

Una funció destructor es crida automàticament quan l'objecte surt de l'abast:

  1. la funció acaba
  2. el programa acaba
  3. un bloc que conté variables locals acaba
  4. es crida un operador de supressió

Nota: destructor també es pot cridar explícitament per a un objecte.

Com cridar els destructors de manera explícita?

Podem cridar els destructors explícitament utilitzant la següent declaració:

object_name.~class_name()>

En què es diferencien els destructors de les funcions dels membres normals?

  • Els destructors tenen el mateix nom que la classe precedit d'una tilde (~)
  • Els destructors no accepten cap argument i no retornen res

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

>

>

Hi pot haver més d'un destructor en una classe?

No, només hi pot haver un destructor en una classe amb un nom de classe precedit de ~, sense paràmetres i sense tipus de retorn.

Quan hem d'escriure un destructor definit per l'usuari?

Si no escrivim el nostre propi destructor a classe, el compilador ens crea un destructor per defecte. El destructor predeterminat funciona bé tret que tinguem memòria o punter assignats dinàmicament a la classe. Quan una classe conté un punter a la memòria assignat a la classe, hauríem d'escriure un destructor per alliberar memòria abans que la instància de classe es destrueixi. Això s'ha de fer per evitar fuites de memòria.

Un destructor pot ser virtual?

Sí, de fet, sempre és una bona idea fer virtuals els destructors a la classe base quan tenim una funció virtual. Vegeu el destructor virtual per a més detalls.

Potser t'agradaria fer un qüestionari sobre destructors.

Articles relacionats