Destructeurs

Les destructeurs ont le rôle inverse des constructeurs. Ils sont appelés lorsqu’une instance de classe sort de la visibilité courante. Par exemple, lors de l’appel 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 d’un destructeur est souvent très simple. Il s’agit généralement de libérer la mémoire prise par l’instance sur le tas, s’il y a lieu. Dans bien des cas, le destructeur standard qui est créé implicitement par le compilateur lorsqu’on n’en a pas défini explicitement est largement suffisant. Il n’en 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 n’a aucun résultat, comme les constructeurs, et n’admet aucun argument ; de ce fait, il ne peut y avoir qu’un destructeur par classe.

D’une façon générale, le destructeur doit tout « remettre en ordre » dans ce que l’instance 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 Précédent Sommaire Sommaire Suivant Suivant