8.9. Pointeur this
Nous allons à présent voir comment les fonctions membres, qui appartiennent
à la classe, peuvent accéder aux données d'un objet, qui est une instance de cette classe. Cela est
indispensable pour bien comprendre les paragraphes suivants.
À chaque appel d'une fonction membre, le compilateur passe implicitement
un pointeur sur les données de l'objet en paramètre. Ce paramètre est le premier paramètre
de la fonction. Ce mécanisme est complètement invisible au programmeur, et nous ne nous attarderons
pas dessus.
En revanche, il faut savoir que le pointeur sur l'objet est accessible
à l'intérieur de la fonction membre. Il porte le nom « this ».
Par conséquent, *this représente l'objet lui-même. Nous verrons une utilisation
de this dans le paragraphe suivant (surcharge
des opérateurs).
this est un pointeur constant, c'est-à-dire qu'on ne peut
pas le modifier (il est donc impossible de faire des opérations arithmétiques dessus). Cela est tout
à fait normal, puisque le faire reviendrait à sortir de l'objet en cours (celui pour lequel la méthode
en cours d'exécution travaille).
Il est possible de transformer ce pointeur constant en un pointeur constant
sur des données constantes pour chaque fonction membre. Le pointeur ne peut toujours pas être modifié,
et les données de l'objet ne peuvent pas être modifiées non plus. L'objet est donc considéré
par la fonction membre concernée comme un objet constant. Cela revient à dire que la fonction
membre s'interdit la modification des données de l'objet. On parvient à ce résultat en ajoutant
le mot clé const à la suite de l'en-tête de la fonction membre. Par exemple :
Dans la fonction membre lit, il est impossible de modifier
l'objet. On ne peut donc accéder qu'en lecture seule à i. Nous verrons une application
de cette possibilité dans la Section 8.15.
Il est à noter qu'une méthode qui n'est pas déclarée comme étant
const modifie a priori les données de l'objet sur lequel elle travaille. Donc,
si elle est appelée sur un objet déclaré const, une erreur de compilation se produit.
Ce comportement est normal. On devra donc toujours déclarer const une méthode qui
ne modifie pas réellement l'objet, afin de laisser à l'utilisateur le choix de déclarer
const ou non les objets de sa classe.
Note : Le mot clé const n'intervient pas dans la signature
des fonctions en général lorsqu'il s'applique aux paramètres (tout paramètre déclaré
const perd sa qualification dans la signature). En revanche, il intervient
dans la signature d'une fonction membre quand il s'applique à cette fonction (ou, plus précisément,
à l'objet pointé par this). Il est donc possible de déclarer deux fonctions membres
acceptant les mêmes paramètres, dont une seule est const. Lors de l'appel,
la détermination de la fonction à utiliser dépendra de la nature de l'objet sur lequel elle doit
s'appliquer. Si l'objet est const, la méthode appelée sera celle qui est
const.