Notions de classe, constructeur et destructeur
Déclaration et définition d’une classe
La déclaration d’une classe précise quels sont les membres (données ou fonctions) publics (c’est-à-dire accessibles à l’utilisateur de la classe) et quels sont les membres privés (inaccessibles à l’utilisateur de la classe). On utilise pour cela les mots-clés public et private, comme dans cet exemple dans lequel la classe point comporte deux membres donnée privés x et y et trois fonctions membres publiques initialise, deplace et affiche : /* ———— Déclaration de la classe point ————- */ class point { /* déclaration des membres privés */ private : int x ; int y ; /* déclaration des membres publics */ public : void initialise (int, int) ; void deplace (int, int) ; void affiche () ; } ; La définition d’une classe consiste à fournir les définitions des fonctions membre. On indique alors le nom de la classe correspondante, à l’aide de l’opérateur de résolution de portée (::). Au sein de la définition même, les membres (privés ou publics — données ou fonctions) sont directement accessibles sans qu’il soit nécessaire de préciser le nom de la classe. Voici, par exemple, ce que pourrait être la définition de la fonction initialise de la classe précédente : void point::initialise (int abs, int ord) { x = abs ; y = ord ; } Ici, x et y représentent implicitement les membres x et y d’un objet de la classe point. 1. Les mots-clés public et private peuvent apparaître à plusieurs reprises dans la déclaration d’une même classe. Une déclaration telle que la suivante est tout à fait envisageable : class X { private : … public : … private : … public : … } ; exos_c++.book Page 98 Jeudi, 5. juillet 2007 11:10 11 © Éditions Eyrolles 99 chapitre n° 7 Notions de classe, constructeur et destructeur 2. Comme on le verra dans le chapitre consacré à l’héritage, il existe un troisième mot-clé, protected, qui n’intervient qu’en cas d’existence de classes dérivées
Utilisation d’une classe
On déclare un « objet » d’un type classe donné en faisant précéder son nom de celui de la classe, comme dans l’instruction suivante qui déclare deux objets a et b de type point : point a, b ; On peut accéder à n’importe quel membre public (donnée ou fonction) d’une classe en utilisant l’opérateur « . ». Par exemple : a.initialise (5, 2) ; appelle la fonction membre initialise de la classe à laquelle appartient l’objet a, c’est-à-dire, ici, la classe point. Affectation entre objets C++ autorise l’affectation d’un objet d’un type donné à un autre objet de même type. Dans ce cas, il y a (tout naturellement) recopie des valeurs des champs de données (qu’ils soient publics ou privés). Toutefois, si, parmi ces champs, se trouvent des pointeurs, les emplacements pointés ne seront pas soumis à cette recopie. Si un tel effet est nécessaire (et il le sera souvent !), il ne pourra être obtenu qu’en « surdéfinissant » l’opérateur d’affectation pour la classe concernée (voyez le chapitre consacré à la surdéfinition d’opérateurs). Constructeur et destructeur Une fonction membre portant le même nom que sa classe se nomme un constructeur. Dès qu’une classe comporte un constructeur (au moins un), il n’est plus possible de déclarer un objet du type correspondant, sans fournir des valeurs pour les arguments requis par ce constructeur (sauf si ce dernier ne possède aucun argument). Le constructeur est appelé après l’allocation de l’espace mémoire destiné à l’objet. Par définition, un constructeur ne renvoie pas de valeur (aucune indication de type, pas même void, ne doit figurer devant sa déclaration ou sa définition). Une fonction membre portant le même nom que sa classe, précédé du symbole tilde (~), se nomme un destructeur. Le destructeur est appelé avant la libération de l’espace mémoire associé à l’objet. Par définition, un destructeur ne peut pas comporter d’arguments et il ne renvoie pas de valeur (aucune indication de type ne doit être prévue)