C++ Référence

Une variable de référence est un alias, c'est-à-dire un autre nom pour une variable déjà existante.

Une fois qu'une référence est initialisée sur une variable, vous pouvez utiliser le nom de la référence ou le nom de la variable pour désigner la variable.

Une référence doit être initialisée lors de sa définition et, une fois liée à une variable, elle ne peut pas être liée à une autre variable.

La syntaxe des références est la suivante :

int a = 10;
int &ref = a;  // ref 是 a 的引用
  • int &refReprésenterefest uneintRéférence à un type.

  • refOuiaun alias pour,refL'opération agit directement sura。

Références C++ vs Pointeurs

Les références sont facilement confondues avec les pointeurs ; il existe trois différences principales entre elles :

  • Il n'existe pas de références nulles ; une référence doit être liée à un espace mémoire valide.
  • Une fois qu'une référence est initialisée à un objet, on ne peut pas la faire pointer vers un autre objet. Un pointeur peut pointer vers un autre objet à tout moment.
  • Une référence doit être initialisée lors de sa création. Un pointeur peut être initialisé à tout moment.
  • L'objet référencé par une référence doit être une variable, tandis qu'un pointeur doit être une adresse.
FonctionnalitésRéférencePointeur
Définition et initialisationDoit être initialisée, et ne peut pas êtrenull。Il peut être laissé non initialisé, peut pointer vers d'autres objets dans le code ultérieur, et peut êtrenull。
SyntaxeUtilisation&Déclaration, par exemple :int &ref = a;Utilisation*Déclaration, par exemple :int *ptr = &a;
réaffectationIl ne peut pas être réaffecté ; une fois initialisé, il fait toujours référence au même objet.Peut être réaffecté pour pointer vers un autre objet, par exemple :ptr = &b;
Valeur nulle (Nullabilité)ne peut pas êtrenull, doit être lié à un objet valide.peut êtrenull, ce qui signifie qu'il ne pointe vers aucun objet.
Utilisation de la mémoireIl n'occupe pas de mémoire supplémentaire (le compilateur l'optimise généralement pour opérer directement sur l'objet référencé).Il occupe de la mémoire supplémentaire (stocke une adresse, généralement un mot machine, par ex. 4 octets ou 8 octets).
Mode d'accèsIl s'utilise directement, sans avoir besoin d'un opérateur de déréférencement, par exemple :ref = 10;il faut utiliser*Utilisez l'opérateur de déréférencement pour accéder à l'objet pointé ou le modifier, par exemple :*ptr = 10;
Indirection multi-niveauxIl ne prend pas en charge plusieurs niveaux d'indirection (il ne peut pas y avoir de référence vers une référence).Il prend en charge plusieurs niveaux d'indirection (par ex., pointeur vers pointeur :int **pptr;)。
Passage de paramètres de fonctionIl est souvent utilisé pour le passage de paramètres de fonction, avec une syntaxe concise, par exemple :void func(int &x) { x = 10; }Il peut également être utilisé pour le passage de paramètres de fonction, mais nécessite l'opérateur de déréférencement, par exemple :void func(int *x) { *x = 10; }
Tableaux et référencesVous ne pouvez pas créer directement un tableau de références, mais vous pouvez créer une référence vers un tableau, par exemple :int (&ref)[10] = arr;Vous pouvez créer un tableau de pointeurs, et vous pouvez également créer un pointeur vers un tableau, par exemple :int *ptrArr[10];
SécuritéPlus sûr, impossiblenull, et la syntaxe est plus intuitive.Il est plus flexible, mais source d'erreurs (par exemple, pointeurs nuls, pointeurs pendants, etc.).
Implémentation sous-jacenteElle est généralement implémentée au moyen de pointeurs, mais le compilateur l'optimise pour opérer directement sur l'objet référencé.Stocke directement l'adresse mémoire de l'objet cible.

Création de références en C++

Considérez un nom de variable comme une étiquette attachée à la variable à son emplacement mémoire. Vous pouvez considérer une référence comme une seconde étiquette attachée à la variable à son emplacement mémoire. Par conséquent, vous pouvez accéder au contenu de la variable soit par le nom de variable d'origine, soit par la référence. Par exemple :

int i = 17;

Nous pouvons déclarer une variable de référence pour i comme suit :

int&  r = i;
double& s = d;

Dans ces déclarations,&se lit commeRéférence。

Par conséquent, la première déclaration peut être lue comme"r est une référence d'entier initialisée à i", la seconde déclaration peut être lue comme"s est une référence de double initialisée à d"。

L'exemple suivant utilise des références int et double :

Exemple

#include <iostream> using namespace std; int main () { // Déclarer des variables simples int i; double d; // Déclarer une variable de référence int& r = i; double& s = d; i = 5; cout << "Valeur de i : " << i << endl; cout << "Valeur de la référence de i : " << r << endl; d = 11.7; cout << "Valeur de d : " << d << endl; cout << "Valeur de la référence de d : " << s << endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7

Les références sont couramment utilisées pour les listes de paramètres de fonction et les valeurs de retour de fonction. Voici deux concepts importants liés aux références C++ que les programmeurs C++ doivent bien comprendre :

ConceptsDescription
Passage de références en tant que paramètresC++ prend en charge le passage de références à des fonctions en tant que paramètres, ce qui est plus sûr que le passage de paramètres ordinaires.
Utilisation de références comme valeurs de retourUne référence peut être renvoyée depuis une fonction C++, comme les autres types de données.
autres extensions