Une référence, ne peut pas être invalide, contrairement aux pointeurs.
Ca c'est ce qu'on dit toujours à propos des références, c'est peut-être même dans la définition.
Elle est initialisée à la création et ainsi ne peut pas 'pointer' sur NULL comme un pointeur pourrait le faire.
Mais quand une référence 'pointe' sur un objet qui est détruit :
Nous avons deux cas possibles :
La référence était précédement valide.
La tout se passe bien car la référence à déjà eu une valeur valide, celle de i avant d'avoir une valeur 'invalide'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <iostream> int i = 2; int& refi = i; // refi est initialisée avec i { int j = 7; // Ici la porté de j est limité jusqu'a la fin des accolades... refi = j; std::cout << "Entre les accolades : refi = " << refi << std::endl; // Affiche 7 } // Ici refi est 'invalidée' car j n'existe plus std::cout << "Juste après les accolades : refi = " << refi << std::endl; // Affiche 2 // Mais comme les références c'est pas trop bête, // en fait ça reprend la dernière référence valide, soit la référence sur i
La référence est initialisé avec un élément qui va devenir invalide.
Dans ce cas la référence est valide à sa création, elle initialisée. Avant la destruction le premier cout nous dit que refi vaut 2, comme il faut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include <iostream> class A { public: int i; }; A* pA = new A; pA->i = 2; int& refi = pA->i; std::cout << "Avant la destruction : refi = " << refi << std::endl; delete pA; std::cout << "Après destruction : refi = " << refi << std::endl;
Et le second nous donne également 2. Mais la référence n'est plus valide car pA->i n'existe plus car pA à été détruit...
Donc en fait refi 'pointe' sur un endroit de la mémoire qui était utilisé avant pour stocker la valeur de i, donc 'vaut' toujours 2, mais c'est comme un pointeur, qui pointait sur un objet que l'on vient de détruire....
Ma question :
![]()
Est il possible que quelqu'un me dise si je dis faut ou non.
Si oui ou est ma faute?![]()
Si non n'est-il pas plus dangereux de se servir des réference dans le cadre des exemples ci-dessus ?
Il est possible de trouver d'autre cas similaires ou les références sont 'invalides'.
J'ai mis pointe, vaut et invalide car je ne sais pas si on peut parler des références avec le vocabulaire des pointeurs.
(compilation et tests réalisés avec VisualStudio 2005, pas de problème de compilation ni de lieur, pas d'avertissement même niveau 4)
Partager