De même que l'on peut placer des variables dans une classe (qu'on appelle alors champs), on peut y placer des fonctions. Exemple:
struct Tableau { double* tab; int n; void alloue(int a){ n = a; tab = new double[n]; } };
Une telle fonction est appelée fonction membre de la classe
Tableau. Remarquez qu'elle peut manipuler directement les champs
n
et tab
de la classe sans préciser à quel objet ils
appartiennent: ils appartiennent à l'objet qui appelle la fonction. On
appelle une fonction membre de la façon suivante:
Tableau A; A.alloue(4);
Cette dernière ligne signifie donc:
{ int a = 4; A.n = a; A.tab = new double[A.n]; }
La différence entre les fonctions membres d'une classe et les fonctions
déclarées en dehors de cette classe est que les premières peuvent accéder
directement aux champs de l'objet qui les appelle tandis que les deuxièmes
doivent avoir l'objet en question comme argument. Par exemple une fonction
qui initialise à 0 tous les champs d'un objet de la classe Tableau
serait:
void initialise(Tableau X){ for (int i = 0; i<X.n; i++) X.tab[i] = 0.; }
et s'appelerait de la façon suivante:
Tableau A; initialise(A);
tandis que l'équivalent avec une fonction membre consiste à ajouter dans la définition de la classe:
void zero(){ for (int i = 0; i<n; i++) tab[i] = 0.; }
et celle-ci s'appelle de la façon:
Tableau A; A.zero();
Le code de la page précédente s'écrit maintenant de façon beaucoup plus
laconique:
Tableau A; A.alloue(4); A.zero(); Tableau B; B.alloue(A.n + 1);
De même que la fonction initialise
peut être découpée en deux, à
savoir sa déclaration:
void initialise(Tableau X);suivie de sa définition:
void initialise(Tableau X){ for (int i = 0; i<X.n; i++) X.tab[i] = 0.; }
on peut également séparer la déclaration à l'intérieur de la classe d'une fonction membre:
void zero();
void Tableau::zero(){ for (int i = 0; i<n; i++) tab[i] = 0.; }
L'indicateur Tableau::
est nécessaire pour préciser à quelle classe
appartient cette fonction.