Salut a tous ceux qui liront ce poste !
Je cherche a comprendre le fonctionnement précis des références en cpp, c'est a dire du petit signe & que l'on peut ajouter aux declarations ( genre int & i =23 ).
Et non pas le fonctionnement de ce meme signe pour récupérer l'adresse d'une variable ( genre int var = 23; int * i = &var; )
En fait si quelqu'un peut simplement m'indiquer ou je peux trouver l'info sur les normes officielles du cpp, ca me sera deja bien utile.
Sinon voici ma préoccupation :
voila la déclaration d'une petite classe pour illustrer :
Code :
- class essai
- {
- protected:
- int i;
- public:
- essai (){i=0;}
- int & get () {return i;}
- void print () {printf ("%i\n", i);}
- };
|
puis lorsque je fais :
Code :
- essai e;
- int var = e.get();
- var = 8;
- e.print ();
|
le resultat affiche est 0
lorsque je fais :
Code :
- essai e;
- int & var = e.get();
- var = 8;
- e.print ();
|
le resultat affiche est 8
La question est donc : le compilateur renvoie t'il tantot la variable par copie (dans le premier cas) dans la pile d'execution comme si la fonction ne renvoyait pas une réference mais bien la valeur (ce qu'il deciderait en voyant que la variable qui recoit la valeur de retour n'est pas une réference), et tantot renvoie t'il effectivement la réference (deuxieme cas, la variable qui recoit la valeur de retour est bien déclarée comme étant une réference) ?
Et dans ce second cas, une petite confirmation m'est necessaire : une réference, en langage machine ca n'existe pas (attention pas de méprise, une réference en cpp, c'est différent d'un pointeur). Dès lors, que fait le compilateur lorsqu'une réference doit etre renvoyée ? Il remplace partout la variable qui recoit la réference renvoyée par l'objet réferencé ( en assembleur, remplacer "var" par "essai::i" ) ?
Ma question a pour but de savoir si ca permet d'optimiser un peu les programmes en simplifiant le processus de retour d'une fonction.
Par ailleurs arretez moi si je dis une annerie, mais si c'est bien le cas, le seul moyen de faire ce genre d'optimisation mais d'empecher qu'on modifie la variable réferencée est de déclarer le type de retour de la fonction constant, genre : const int & get ();
Merci d'avance pour vos reponses.
Zbouirf