logo

Destructeurs en C++

Qu'est-ce qu'un destructeur ?

Destructor est une fonction membre d'instance qui est invoquée automatiquement chaque fois qu'un objet va être détruit. Cela signifie qu'un destructeur est la dernière fonction qui sera appelée avant la destruction d'un objet.

  • Un destructeur est également une fonction membre spéciale comme un constructeur. Le destructeur détruit les objets de classe créés par le constructeur.
  • Le destructeur a le même nom que son nom de classe précédé d'un symbole tilde (~).
  • Il n'est pas possible de définir plus d'un destructeur.
  • Le destructeur n'est qu'un moyen parmi d'autres de détruire l'objet créé par le constructeur. Par conséquent, le destructeur ne peut pas être surchargé.
  • Le destructeur ne nécessite aucun argument et ne renvoie aucune valeur.
  • Il est automatiquement appelé lorsqu'un objet sort de la portée.
  • Le destructeur libère l'espace mémoire occupé par les objets créés par le constructeur.
  • Dans le destructeur, les objets sont détruits à l'inverse de la création d'un objet.

La chose doit être notée ici si l'objet est créé en utilisant new ou si le constructeur utilise new pour allouer de la mémoire qui réside dans la mémoire tas ou dans le magasin libre, le destructeur doit utiliser delete pour libérer la mémoire.

Syntaxe

La syntaxe pour définir le destructeur au sein de la classe :

~ () { // some instructions }>

La syntaxe pour définir le destructeur en dehors de la classe :

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

Exemple 1

Le code ci-dessous démontre l'exécution automatique des constructeurs et des destructeurs lorsque les objets sont créés et détruits, respectivement.

C++

Shilpa Shetty




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

>

>

Sortir

 Constructor executed Destructor executed>

Exemple 2

Le code ci-dessous démontre l'exécution automatique des constructeurs et des destructeurs à chaque fois que plusieurs objets sont créés et détruits, respectivement.

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

>

>

Sortir

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

Exemple 3

Le programme C++ ci-dessous montre le nombre de fois où les constructeurs et les destructeurs sont appelés.

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

>

>

Sortir

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>

Note: Les objets sont détruits dans l'ordre inverse de leur création. Dans ce cas, t3 est le premier à être détruit, tandis que t est le dernier.

Propriétés du destructeur

Voici les principales propriétés de Destructor :

  • La fonction destructeur est automatiquement invoquée lorsque les objets sont détruits.
  • Il ne peut pas être déclaré statique ou const.
  • Le destructeur n'a pas d'arguments.
  • Il n'a pas de type de retour, pas même void.
  • Un objet d'une classe avec un Destructeur ne peut pas devenir membre du syndicat.
  • Un destructeur doit être déclaré dans la section publique de la classe.
  • Le programmeur ne peut pas accéder à l'adresse du destructeur.

Quand le destructeur est-il appelé ?

Une fonction destructeur est appelée automatiquement lorsque l'objet sort de la portée :

  1. la fonction se termine
  2. le programme se termine
  3. un bloc contenant des variables locales se termine
  4. un opérateur de suppression est appelé

Note: destructeur peut également être appelé explicitement pour un objet.

Comment appeler explicitement des destructeurs ?

Nous pouvons appeler explicitement les destructeurs en utilisant l’instruction suivante :

object_name.~class_name()>

En quoi les destructeurs sont-ils différents des fonctions membres normales ?

  • Les destructeurs ont le même nom que la classe précédé d'un tilde (~)
  • Les destructeurs n'acceptent aucun argument et ne renvoient rien

C++




méthode tostring en java

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

>

>

Peut-il y avoir plus d’un destructeur dans une classe ?

Non, il ne peut y avoir qu'un seul destructeur dans une classe avec un nom de classe précédé de ~, aucun paramètre et aucun type de retour.

Quand devons-nous écrire un destructeur défini par l’utilisateur ?

Si nous n'écrivons pas notre propre destructeur en classe, le compilateur crée un destructeur par défaut pour nous. Le destructeur par défaut fonctionne correctement, sauf si nous avons alloué dynamiquement de la mémoire ou un pointeur en classe. Lorsqu'une classe contient un pointeur vers la mémoire allouée dans la classe, nous devons écrire un destructeur pour libérer de la mémoire avant que l'instance de classe ne soit détruite. Cela doit être fait pour éviter les fuites de mémoire.

Un destructeur peut-il être virtuel ?

Oui, en fait, c'est toujours une bonne idée de rendre les destructeurs virtuels dans la classe de base lorsque nous avons une fonction virtuelle. Voir destructeur virtuel pour plus de détails.

Vous aimerez peut-être répondre à un quiz sur les destructeurs.

Articles Liés