Contrairement aux données locales d’une fonction,
les données membres d'une classe ne peuvent pas être
initialisées. Il faut donc prévoir une méthode
se chargeant de ce travail et penser à l’appeler
lors de chaque instanciation d’objet. Dans le cas
d’un oubli d’appel de cette méthode d’initialisation,
le fonctionnement de l’objet risque de produire des
résultats surprenants !
De manière symétrique, nous pouvons prévoir
une méthode qui serait la dernière appelée
pour cet objet dont le rôle serait la destruction
propre de ce même objet. Elle permettrait par exemple
la libération en mémoire des variables allouées
dynamiquement, suppression de graphiques, fermetures de
fichiers, …
Afin d’éviter ces oublis, il existe une manière
de prévoir ces initialisations ainsi que ces terminaisons,
ce sont les constructeurs et les destructeurs. Ainsi, lors
de la création de l’objet la constructeur sera
appelé (il porte le même nom que la classe,
ne retourne rien, même pas void). Lors de
la destruction de cette classe, son destructeur (~nomClasse)
sera invoqué.
Ainsi, en considérant une classe appelée maClasse,
si l’on désire avoir les variables a et b initialisées,
il faut :
Ajouter le constructeur dans la section public
.hpp :
public :
maClasse( int, int) ;
.cpp :
maClasse : : maClasse( int
v1, int v2 = 10) {
a = v1 ; b = v2 ;
}
Le constructeur étant une méthode (publique)
comme une autre, il lui est possible d’avoir des paramètres,
éventuellement même des paramètres par
défaut.
Exemple :
maClasse c1(12) ; // a = 12,
b=10
maClasse c2(5,15) ; // a = 5, b=15
Concernant le destructeur, le fonctionnement est similaire
.hpp
~maClasse( ) ;
.cpp
maClasse : :~maClasse( ) {
…
}