Duplication possible:
Quelles sont les différences entre la variable de pointeur et la variable de référence en C ++?
Y at-il des avantages à passer par un pointeur sur le passage par référence en C ++?
Dans les deux cas, j’ai atteint le résultat. Alors, quand est-on préféré à l’autre? Quelles sont les raisons que nous utilisons l’un sur l’autre?
#include using namespace std; void swap(int* x, int* y) { int z = *x; *x=*y; *y=z; } void swap(int& x, int& y) { int z = x; x=y; y=z; } int main() { int a = 45; int b = 35; cout<<"Before Swap\n"; cout<<"a="<<a<<" b="<<b<<"\n"; swap(&a,&b); cout<<"After Swap with pass by pointer\n"; cout<<"a="<<a<<" b="<<b<<"\n"; swap(a,b); cout<<"After Swap with pass by reference\n"; cout<<"a="<<a<<" b="<<b<<"\n"; }
Sortie
Before Swap a=45 b=35 After Swap with pass by pointer a=35 b=45 After Swap with pass by reference a=45 b=35
Une référence est sémantiquement la suivante:
T& <=> *(T * const)
const T& <=> *(T const * const)
T&& <=> [no C equivalent]
(C ++ 11)
Comme pour les autres réponses, la réponse à la question suivante provient de la FAQ C ++: références si possible, pointeurs si nécessaire.
Un avantage par rapport aux pointeurs est que vous avez besoin de transtypage explicite pour passer NULL. C’est quand même possible. Parmi les compilateurs que j’ai testés, aucun n’émet d’avertissement pour les éléments suivants:
int* p() { return 0; } void x(int& y) { y = 1; } int main() { x(*p()); }
En fait, la plupart des compilateurs émettent le même code pour les deux appels de fonctions, car les références sont généralement implémentées à l’aide de pointeurs.
Suivant cette logique, lorsqu’un argument de type référence (non-const) est utilisé dans le corps de la fonction, le code généré fonctionnera simplement en silence sur l’adresse de l’argument et il le déréférencera. De plus, lorsqu’un appel à une telle fonction est rencontré, le compilateur génère un code qui transmet l’adresse des arguments au lieu de copier leur valeur.
Fondamentalement, les références et les pointeurs ne sont pas très différents du sharepoint vue de la mise en œuvre, la principale (et très importante) différence réside dans la philosophie: une référence est l’object lui-même, avec un nom différent.
Les références ont quelques avantages supplémentaires par rapport aux pointeurs (par exemple, elles ne peuvent pas être NULL
, donc elles sont plus sûres à utiliser). Par conséquent, si vous pouvez utiliser C ++, le passage par référence est généralement considéré comme plus élégant et devrait être préféré. Cependant, en C, il n’y a pas de passage par référence, donc si vous voulez écrire du code C (ou, horribile dictu, du code qui comstack avec un compilateur C et C ++, bien que ce ne soit pas une bonne idée), Limitez-vous à utiliser des pointeurs.
Passer par pointeur est la seule façon de passer “par référence” en C, vous le voyez donc encore un peu.
Le pointeur NULL est une convention pratique pour dire qu’un paramètre est inutilisé ou non valide, utilisez donc un pointeur dans ce cas.
Les références ne peuvent pas être mises à jour une fois qu’elles sont définies, utilisez donc un pointeur si vous avez besoin de le réaffecter.
Préférez une référence dans tous les cas où il n’y a pas de bonne raison de ne pas le faire. Faites-le si vous le pouvez.
Voici un bon article sur le sujet – “Utilisez des références quand vous le pouvez, et des indications lorsque vous devez le faire.”
Utilisez les références tout le temps et les pointeurs uniquement lorsque vous devez vous référer à NULL
dont la référence ne peut pas faire référence.
Voir cette FAQ: http://www.parashift.com/c++-faq-lite/references.html#faq-8.6