Les références en C++ - déclaration et interêts
Une référence est similaire à un pointeur, c'est pourquoi nous l'introduisons après avoir parlé de pointeur. Cependant, vous n'obtiendrez une réelle appréciation de la valeur des références qu'une fois que vous aurez appris à définir des fonctions. Les références deviennent encore plus importantes dans le contexte de la programmation orientée objet plus tard.
Une référence est un nom que vous pouvez utiliser comme alias pour une autre variable. Évidemment, elle doit être comme un pointeur dans la mesure où elle fait référence à quelque chose d'autre en mémoire, mais il existe quelques différences cruciales. Contrairement à un pointeur, vous ne pouvez pas déclarer une référence et ne pas l'initialiser. Comme une référence est un alias, la variable pour laquelle elle est un alias doit être fournie lorsque la référence est initialisée. De même, une référence ne peut pas être modifiée pour devenir l'alias d'une autre variable. Une fois qu'une référence est initialisée en tant qu'alias d'une variable, elle continue à faire référence à cette même variable pour le reste de sa durée de vie.
Création de références
Une référence est déclarée de la même manière qu'une variable normale, sauf qu'une esperluette (&) est ajoutée entre le type de données et le nom de la variable. De plus, en même temps que la référence est déclarée, elle doit être initialisée avec une variable du type spécifié.
Exemple 1
int x {5}; int& r {x}; // r est un alias de x int &s {x}; // syntaxe alternative int& t; // erreur : doit être initialisé
L'esperluette (&) suivant le nom du type indique que la variable définie, r (ou s), est une référence à une variable de type int. La variable qu'il représente est spécifiée dans l'initialiseur entre accolades. Ainsi, r est de type "référence à int". Vous pouvez utiliser la référence comme alternative au nom de variable d'origine. Voici un exemple :
Exemple 2
r = 10; // attribue une valeur à r/x
Références et pointeurs
Une référence est similaire à un pointeur qui pointe toujours vers la même chose. Cependant, alors qu'un pointeur est une variable qui pointe vers une autre variable ou un autre objet, une référence n'est qu'un alias et n'a pas d'adresse propre.
Exemple 3
int* ptr = &r; // l'adresse assignée à ptr est l'adresse de x
Généralement, chaque fois qu'un pointeur n'a pas besoin d'être réaffecté, une référence doit être utilisée à la place, car une référence est plus sûre qu'un pointeur car elle doit toujours faire référence à quelque chose. Cela signifie qu'il n'est pas nécessaire de vérifier si une référence fait référence à null, comme cela devrait être fait avec des pointeurs. Il est possible qu'une référence soit invalide - par exemple, lorsqu'une référence fait référence à un pointeur nul (nullptr) - mais il est beaucoup plus facile d'éviter ce genre d'erreur avec des références qu'avec des pointeurs.
Exemple 4
int* ptr = nullptr; // pointeur nul int& ref = *ptr; ref = 10; // erreur : accès mémoire invalide
Référence Rvalue
Avec C++11 est venu un nouveau type de référence appelé référence rvalue. Cette référence peut lier et modifier des objets temporaires (rvalues), tels que des valeurs littérales et des valeurs de retour de fonction. Une référence rvalue est formée en plaçant deux esperluettes après le type.
Exemple 5
int&& ref = 1 + 2; // référence rvalue
La référence rvalue prolonge la durée de vie de l'objet temporaire et lui permet d'être utilisé comme une variable ordinaire.
Exemple 6
ref += 3; cout << ref; // "6"
L'avantage des références rvalue est qu'elles permettent d'éviter les copies inutiles lorsqu'il s'agit d'objets temporaires. Cela offre de meilleures performances, en particulier lors de la gestion de types plus volumineux, tels que des chaînes et des objets.