C++ : PROGRAMMATION-OBJET
Fonctions-membres
L’objet implicite
Rappelons que pour d’ecrire une classe (cf (1.2.5)), on commence par declarer les donnees et fonctions membres d’un objet de cette classe, puis on definit les fonctions-membres de ce meme objet. Cet objet n’est jamais nomme, il est implicite (au besoin, on peut y faire reference en le designant par *this). Ainsi dans l’exemple du paragraphe (2.1.1), lorsqu’on ecrit les definitions des fonctions-membres de la classe Complexe,on se refere directement aux variables re et im, et ces variables sont les donnees-membres du nombre complexe implicite qu’on est en train de programmer et qui n’est jamais nomme. Mais s’il y a un autre nombre complexe, comme g dans la d´efinition de la fonction operator+, les donnees-membres de l’objet g sont d´esignees par la notation pointee habituelle, `a savoirg.re et g.im (1.5.2). Notons au passage que, bien que ces donnees soient priv´ees, elles sont accessibles `a ce niveau puisque nous sommes dans la definition de la classe Complexe.
(2.2.2) Flux de l’information Chaque fonction-membre est une unité de traitement correspondant `a une fonctionnalite bien precise et qui sera propre `a tous les objets de la classe. Pour faire son travail lors d’un appel, cette unit´e de traitement dispose des informations suivantes : – les valeurs des donnees-membre (publiques ou privees) de l’objet auquel elle appartient,
– les valeurs des parametres qui lui sont transmises. En retour, elle fournit un resultat qui pourra etre utilise apres l’appel. Ainsi : Avant de programmer une fonction-membre, il faudra identifier quelle est l’information qui doit y entrer (parametres) et celle qui doit en sortir (resultat).
Constructeurs et destructeurs
Un constructeur est une fonction-membre declaree du meme nom que la classe, et sans type : Nom classe(<parametres>);
Fonctionnement : `a l’execution, l’appel au constructeur produit un nouvel objet de la classe, dont on peut prevoir l’initialisation des donnees-membres dans la definition du constructeur. Exemple : avec la classe Complexe decrite en (2.1.1), l’expression Complexe(1.0, 2.0) a pour valeur un nombre complexe de partie r´eelle 1 et de partie imaginaire 2. Dans une classe, il peut y avoir plusieurs constructeurs `a condition qu’ils different par le nombre ou le type des parametres. Un constructeur sans parametre s’appelle constructeur par defaut.
Initialisation des objets Dans une classe, il est possible ne pas mettre de constructeur. Dans ce cas, lors de la declaration d’une variable de cette classe, l’espace memoire est reserve mais les donnees-membres de l’objet ne re¸coivent pas de valeur de depart : on dit qu’elles ne sont pas initialisees. Au besoin, on peut prevoir une fonction membre publique pour faire cette initialisation. En revanche : S’il y a un constructeur, il est automatiquement appel´e lors de la d´eclaration d’une variable de la classe. Exemples avec la classe Complexe d´eclar´ee en (2.1.1) :
Complexe z; // appel automatique du constructeur par d´efaut // ´equivaut `a : Complexe z = Complexe();
Complexe z (1.0, 2.0); // appel du constructeur paramétre // ´equivaut `a : Complexe z = Complexe(1.0, 2.0); On retiendra que : L’utilit´e principale du constructeur est d’effectuer des initialisations pour chaque objet nouvellement cr´ e´ e.
Initialisations en chaîne Si une classe Class A contient des données-membres qui sont des objets d’une classe Class B, par exemple :
class Class A { public: Class A(…); // constructeur … private: Class B b1, b2; // deux objets de la classe Class B … }; alors, `a la cr´eation d’un objet de la classe Class A, le constructeur par defaut de Class B (s’il existe) est automatiquement appel´e pour chacun des objets b1, b2 : on dit qu’il y a des initialisations en chaıne. Mais pour ces initialisations, il est egalement possible de faire appel `a un constructeur parametre de Class B,`a condition de definir le constructeur de Class A de la manière suivante :
Class A :: Class A(…) : b1 (…), b2 (…) <instruction-bloc>