Introduction au C++ et à la programmation objet
Pointeurs sur une structure
L’accès aux champs d’une structure par l’intermédiaire d’un pointeur se fait avec l’opérateur ->: struct personne { char nom[20]; char prenom[20]; int age; }; personne *p; … pt-gt;age=20;
Dans l’exemple ci-dessus, on aurait aussi pu accéder au champ age par: *(p.age) La taille d’une structure (donnée par l’opérateur sizeof) n’est pas forcément égale à la somme de la taille de ses
champs.
Une référence, pour quoi faire ? Les principales utilisations des références sont les suivantes: • Le passage des paramètres aux fonctions • La déclaration de membres de classes • La valeur de retour renvoyée par les fonctions Les deux premières utilisations sont utiles pour: • Economiser de la place en mémoire, si les objets à passer prennent beaucoup de mémoire. • Utiliser le polymorphisme.
Passage des paramètres par référence Le programme ci-dessous renvoie 5: void f(int X) { X=0; }; main() { int A=5; f(A); cout << A << « \n »; };
En effet, lorsque la variable X est passée à la fonction f, sa valeur est recopiée dans la variable locale X. C’est la copie locale de X qui est mise à zéro, elle sera détruite dès le retour de la fonction. Par contre, le programme ci-dessous renvoie 0: void f(int& X) { X=0; }; main() { int A=5; f(A); cout << A << « \n »; };
En effet, la déclaration int& X dans le prototype de la fonction f indique un passage des paramètres par référence. X est donc un synonyme de la variable passée, et non plus une recopie. En conséquence, la ligne X=0 dans f remet à 0 la variable A. Passer un paramètre par référence revient donc à passer un paramètre à la fonction, tout en laissant à celle-ci la possibilité de modifier la valeur de la variable ainsi passée, donc d’en faire aussi une valeur de retour..
Pourquoi renvoyer des références ? Pour deux raisons principales: • Renvoyer une référence est très rapide, car une référence n’est qu’une adresse (quelques octets). Par contre, renvoyer un objet peut être coûteux en ressources, car cela met en jeu le constructeur de copie et l’objet peut être très volumineux • Renvoyer une référence permet aussi de renvoyer une « lvalue », c’est-à-dire quelque chose qui peut se mettre à gauche d’un signe = Regardons en effet le programme suivant: int A,B; int& renvAouB(bool s) { return (s==true ?) A : B; }; main() { A = 10; B = 20; cout << A << B <<« \n »; // ecrit 10 20 renvAouB(true) = 5; cout << A << B <<« \n »; // ecrit 5 20 };