
Envoyé par
ram_0000
Différence pointeur/reference
Lorsque l'on m'a apris cette notion, le collègue qui m'a enseigné m'a dit:
1/ Une référence, c'est comme un pointeur (juste la syntaxe est différente)
2/ Un pointeur peut être NULL,
3/ Une référence ne peut pas être NULL.
C'est une première approximation (du moins si on ajoute qu'une référence est automatiquement référencée et ne peut pas être rebindée). Il y a un certains nombres de détails qui font que s'attacher trop fort à cette première approximation pose des problèmes.
Une référence introduit un nom supplémentaire pour un objet. Et si cet objet est temporaire, sa durée de vie va être prolongée pour correspondre à celle de la référence.
std::string const& foo = std::string("bar") + std::string("quux");
par exemple a des effets sur la durée de vie du temporaire qu'il n'est pas possible d'avoir avec des pointeurs.
En interne, une référence est gérée comme un pointeur donc c'est les mêmes performances lors du passage de paramètres
Pour le passage de paramètre, il y a de grandes chances que ce soit le cas. D'autres utilisations de références peuvent être plus transparentes.
struct s { int a, b } x; int & b = x.b;
le compilateur peut très bien ne jamais utiliser de la mémoire pour b.
Donc on utilise un pointeur quand cela à un sens qu'il soit NULL, sinon on utilise une référence.
C'est un critère permettant de choisir. Pas le plus pertinent à mon avis. J'ai beaucoup de mal à préférer
1 2 3
| void f(Type& x) {
delete &x;
} |
à l'alternative avec des pointeurs. Même si on ne passe jamais un pointeur nul. Je crois avoir expliqué dans le passé mon point de vue en détail.
Partager