Il existe de même une fonction membre, le destructeur, qui est appelée
automatiquement pour détruire un objet à la fin du bloc dans lequel il a
été déclaré (de même que l'on détruit les variables locales à un bloc à la
fin du bloc). Par défaut, il se contente de détruire les différents
champs. Si l'un des champs est un objet d'une certaine classe, il appelle
le destructeur de cette classe sur ce champ. Il peut également être précisé
(c-à-d redéfini dans la classe). Par convention, son nom est un tilde
(~
) suivi du nom de la classe, et il ne renvoie rien. Il doit
également être public
. Dans notre
cas, il sera très utile pour désallouer le tableau tab
, car en
effet, détruire la variable double* tab
ne libère pas le tableau qui
est pointé par tab
si celui-ci a été alloué, mais au contraire se
contente d'effacer le pointeur. Préciser la désallocation du tableau dans le
destructeur permet de ne pas avoir à le faire manuellement pour chacune des
variables de type Tableau
définie dans le code !
class Tableau { double* tab; int n; public: Tableau(){ n = 0; } ~Tableau(){ if (n != 0) delete[] tab; } // autres champs et fonctions membres };
Le destructeur est appelé automatiquement quand le bloc dans lequel l'objet
a été déclaré se termine. Il est impossible de faire en sorte qu'il ne soit
pas appelé à ce moment-là, ou de l'appeler manuellement par son nom.
Dans le cas particulier du retour d'une fonction, l'objet renvoyé par
return
est soit directement transmis là où la fonction a été
appelée, sans appel au destructeur (il est alors considéré comme local non
pas à la fonction mais à l'endroit du code où la fonction a été appelée),
soit il est d'abord recopié dans une nouvelle variable (qui elle est
considérée comme locale à l'endroit où la fonction a été appelée) et
ensuite détruit par appel au destructeur.