Comparaison des références et des pointeurs en C++
Les références sont un concept du C++. Les débutants ont tendance à confondre les références avec les pointeurs.
Dans le programme suivant, n est une référence à m, et m est le référent.
int m; int &n = m;
n est équivalent à un alias (surnom) pour m. Toute opération sur n est une opération sur m.
Ainsi, n n'est ni une copie de m ni un pointeur vers m ; en fait, n est m lui-même.
Règles pour les références :
- (1) Une référence doit être initialisée lors de sa création (un pointeur peut être initialisé à tout moment).
- (2) Il ne peut pas y avoir de référence NULL ; une référence doit être associée à une unité de stockage valide (un pointeur peut être NULL).
- (3) Une fois qu'une référence est initialisée, la relation de référence ne peut pas être modifiée (un pointeur peut changer l'objet vers lequel il pointe à tout moment).
Dans l'exemple de programme suivant, k est initialisé en tant que référence à i.
L'instruction k = j ne modifie pas k pour qu'il devienne une référence à j ; elle change seulement la valeur de k en 6.
Comme k est une référence à i, la valeur de i devient aussi 6.
int i = 5; int j = 6; int &k = i; k = j; // k 和 i 的值都变成了 6;
Le rôle principal des références est de passer les paramètres de fonction et les valeurs de retour.
En C++, il existe trois façons de passer les paramètres de fonction et les valeurs de retour : le passage par valeur, le passage par pointeur et le passage par référence.
Voici un exemple de programme de « passage par valeur ».
Comme x à l'intérieur du corps de la fonction Func1 est une copie de la variable externe n, modifier la valeur de x n'affecte pas n, donc la valeur de n reste 0.
void Func1(int x)
{
x = x + 10;
}
...
int n = 0;
Func1(n);
cout << "n = " << n << endl; // n = 0
Voici un exemple de programme de « passage par pointeur ».
Comme x à l'intérieur du corps de la fonction Func2 est un pointeur vers la variable externe n, modifier le contenu pointé par le pointeur entraîne un changement de la valeur de n, donc la valeur de n devient 10.
void Func2(int *x)
{
(* x) = (* x) + 10;
}
...
int n = 0;
Func2(&n);
cout << "n = " << n << endl; // n = 10
Voici un exemple de programme de « passage par référence ».
Comme x à l'intérieur du corps de la fonction Func3 est une référence à la variable externe n, x et n sont la même chose. Modifier x équivaut à modifier n, donc la valeur de n devient 10.
void Func3(int &x)
{
x = x + 10;
}
...
int n = 0;
Func3(n);
cout << "n = " << n << endl; // n = 10
En comparant les trois exemples de programmes ci-dessus, vous constaterez que le « passage par référence » se comporte comme le « passage par pointeur » mais s'écrit comme le « passage par valeur ».
En fait, tout ce que les « références » peuvent faire, les « pointeurs » peuvent aussi le faire. Pourquoi avons-nous encore besoin des « références » ?
La réponse est « utilisez le bon outil pour le bon travail. »
Les pointeurs peuvent manipuler n'importe quoi en mémoire sans contraintes. Bien que les pointeurs soient puissants, ils sont très dangereux.
Si vous avez vraiment juste besoin d'emprunter un "alias" pour un objet, utilisez alors une "référence" au lieu d'un "pointeur" pour éviter les accidents.