Il est parfaitement possible de prendre ladresse dun membre de structure (ou de classe), comme ceci :
employe *pempl;int *empl_age = &(pempl->age);
Noter cependant les parenthèses imposées par la précédence des opérateurs (voir tableau en annexe ; pour lintérêt et lusage des pointeurs de fonctions, voir chapitre 5.)
Un problème se pose toutefois avec les fonctions membres non statiques. En effet, celles-ci admettent un paramètre implicite this
. De ce fait, lécriture suivante :
struct exemple { // ... void methode(int); }; void (*pf)(int) = exemple::methode; // incorrect
est interdite parce que le type de la fonction membre methode
nest pas void (*)(int)
. Le langage fournit donc des opérateurs spéciaux pour indiquer des pointeurs sur des membres dune classe ; en loccurrence, il faut ici utiliser ::*
pour avoir le type correct de fonction :
void (exemple::*pf)(int) = exemple::methode; // ok
Il est obligatoire de préciser exemple::
devant le nom de la méthode, car dautres classes (dérivées, voir chapitre 8) pourraient être utilisées dans certains cas. Pour appeler ces méthodes, il faut toujours une instance de exemple
. On utilise les opérateurs .*
et ->*
:
exemple ex, *pex;(ex.*pf)(6); // équivaut à ex.methode(6);(pex->*pf)(9); // équivaut à pex->methode(9);
Noter les parenthèses obligatoires car les opérateurs .*
et ->*
ont une précédence plus faible que les parenthèses dappel de fonction (voir tableau en annexe). De plus, on ne peut pas ici omettre le déréférencement de pf
comme on le ferait pour des pointeurs sur des fonctions normales.
On peut prendre des pointeurs sur des fonctions en ligne, mais celles-ci ne le sont plus forcément dans ce cas.
Précédent | Sommaire | Suivant |