Les destructeurs ont le rôle inverse des constructeurs. Ils sont appelés lorsquune instance de classe sort de la visibilité courante. Par exemple, lors de lappel de la fonction g(autre au)
, sous la forme g(1)
, nous avons dit que le constructeur autre::autre(double)
était appelé pour la variable automatique au
, argument de g
. À la fin de la fonction g
, le destructeur afférent est appelé.
La tâche dun destructeur est souvent très simple. Il sagit généralement de libérer la mémoire prise par linstance sur le tas, sil y a lieu. Dans bien des cas, le destructeur standard qui est créé implicitement par le compilateur lorsquon nen a pas défini explicitement est largement suffisant. Il nen est toutefois pas toujours ainsi. Imaginons une classe qui utilise un grand tableau créé dans le tas (par new
par exemple, comme vu au chapitre 3) ; dans ce cas, un destructeur sera défini qui libérera cette place :
class troisieme { char *tampon; unsigned taille; public : troisieme() { taille = 0; tampon = 0; } // constructeur par défaut troisieme(int t) { tampon = new char[taille = t]; } // ce constructeur prend une place dans le tas ~troisieme() { delete tampon; } // destructeur // ... };
Le destructeur a pour nom le nom de la classe précédé du symbole tilde ~
. Un destructeur na aucun résultat, comme les constructeurs, et nadmet aucun argument ; de ce fait, il ne peut y avoir quun destructeur par classe.
Dune façon générale, le destructeur doit tout « remettre en ordre » dans ce que linstance de classe peut avoir modifié. Outre la libération de la mémoire prise, il peut aussi avoir à fermer des fichiers ouverts, à détruire des éléments provisoires, etc. Le destructeur standard ne fait rien.
Précédent | Sommaire | Suivant |