Intérêt des constructeurs

Nous avons dit au début de ce long paragraphe sur les constructeurs et destructeurs qu’ils étaient fournis en premier lieu pour résoudre le problème posé par l’initialisation des membres privés d’une classe, sans perdre les avantages de l’encapsulation des données. Cependant, nous avons vu qu’ils résolvent aussi les deux autres problèmes que posait la méthode élémentaire d’initialisation. D’une part, ils permettent en effet une initialisation arbitrairement complexe, avec de nombreux appels de fonctions, des boucles, etc. D’autre part, le constructeur par défaut est appelé automatiquement lors de la création de variables automatiques (s’il existe, sinon une erreur de compilation est produite), et le destructeur est appelé lorsque la variable automatique devient inutile.

De plus, la possibilité de supprimer le constructeur par défaut en en définissant d’autres avec paramètres empêche un programmeur étourdi d’initialiser une variable automatique lorsque c’est absolument nécessaire ; par exemple, comme on le verra au chapitre 9, la classe iostream ne possède pas de constructeur par défaut, mais un constructeur avec tampon ; de la sorte, on ne peut pas créer une instance de cette classe sans lui fournir le tampon nécessaire. Il s’agit là d’un mécanisme caché extrêmement puissant qui assure que les instances d’une classe contiennent toujours des valeurs significatives et cohérentes (à condition que les méthodes de la classe aient été définies correctement évidemment).

Les constructeurs sont donc beaucoup plus intéressants que les initialisateurs usuels. On retiendra qu’il s’agit d’un mécanisme puissant, qui ne se maîtrise pas immédiatement : une certaine accoutumance est nécessaire.

Exercice 6.3

Écrire une classe chaine, contenant une chaîne de caractères de longueur arbitraire, et telle que la fonction suivante soit correcte (syntaxiquement parlant, car son effet est sans intérêt), ainsi que le programme qui suit :

void f(chaine& c1, chaine&  c2 = chaine() )     {         chaine c = c2;         if (c2.longueur() == 0) c.ajoute("Début = ");         c.ajoute(c1).ajoute(c2);         c.ecrire();     }main()     {         f("suite\n");         f(" milieu ", "bord");				         return 0;     }

Il ne faut pas gaspiller de mémoire, mais deux chaînes même identiques seront conservées dans deux zones différentes. Le programme doit provoquer l’écriture de la chaîne Début = suite, puis sur la ligne suivante de bord milieu bord.

On pourra utiliser les fonctions de <string.h> et des autres librairies standard nécessaires.

Voir solution
Précédent Précédent Sommaire Sommaire Suivant Suivant