Des références sont en particulier utilisées lors du "passage par référence"
void swap(int& i, int& j)
{
int tmp =
i;
i = j;
j = tmp;
}
main()
{
int x, y;
/ / ...
swap(x,
y);
}
Ici i et j sont des alias respectivement pour les x et y de la fonction main(). En d'autres termes, iest x — pas un pointeur sur x, ni une copie de x, mais x lui-même. Quoique vous fassiez à i, vous le faîtes à x, et vice versa.
OK. Voilà comment vous devriez penser les références en tant que programmeur. Maintenant, au risque de vous embrouiller en vous donnant une perspective différente, voici comment les références sont implantées par les compilateurs. Tout en dessous, une référence i à l'objet x est typiquement l'adresse machine de l'objet x. Mais quand le programmeur dit i++, le compilateur produit le code qui incrémente x. En particulier, les bits d'adressage que le compilateur utilise pour obtenir x ne sont pas changés. Un programmeur C pensera à ceci comme au passage par adresse, avec la variante syntaxique (1) de déplacer & de l'appeleur vers l'appelé, et (2) l'élimination des *'s. En d'autres termes, un programmeur de C pensera i comme une macro pour (*p), où p est unpointeur sur x (i.e. le compilateur déréférence automatiquement le pointeur sous-jacent; i++ est changé en (*p)++ et i = 7 est automatiquement changé en *p = 7).
Note importante: Quoiqu'une référence soit souvent implantée en utilisant une adresse dans le langage d'assemblage sous-jacent, s'il vous plaît ne pensez pas une référence comme un drôle de pointeur sur un objet. Une référence est l'objet. Ce n'est pas un pointeur sur l'objet, ni une copie de l'objet. C' est l'objet.
[ Haut | Bas | Section précédente | Section suivante ]
Rappelez-vous: la référence est la referent, ainsi changer la référence change le referent. Dans le jargon du compilateur, une référence est une "lvalue", c'est à dire quelque chose qui peut apparaître du côté gauche d'un opérateur d'affectation (operator=).
[ Haut | Bas | Section précédente | Section suivante ]
Cette propriété peut sembler étrange de prime abord. Par exemple, personne ne pense que l'expression f() = 7 ait un sens. Cependant, si a est un objet de class Tableau, la plupart des personnes pensent que a[i] = 7 a un sens quoique a[i] n'est en réalité rien d'autre qu'un appel de fonction déguisé (Tableau::operator[](int) est appelé, qui correspond à l'opérateur d'indicage pour la classe Tableau).
class Tableau {
public:
int size() const;
float& operator[]
(int index);
// ...
};
main()
{
Tableau a;
for (int i = 0; i < a.size(); ++i)
a[i] = 7; // This line invokes Tableau::operator[](int)
}
[ Haut | Bas | Section précédente | Section suivante ]
Vous ne pouvez pas séparer la référence du referent.
À la différence d'un pointeur, une fois qu'une référence est liée à un objet, elle ne peut pas "être repositionnée" sur un autre objet. La référence elle-même n'est pas un objet (elle n'a aucune identité; la prise de l'adresse d'une référence vous donne l'adresse du referent; rappelez-vous: la référence est son referent).
En un sens, une référence est semblable à un constpointeur comme int * const p (par opposition à un pointeur sur const comme const int * p). Malgré cette similitude apparente, s'il vous plaît ne confondez pas les références avec des pointeurs; ils ne sont pas du tout identiques.
[ Haut | Bas | Section précédente | Section suivante ]
Des références sont habituellement préférées au pointeurs toutes les fois que vous n'avez pas besoin de "changer de référent" . Ceci signifie habituellement que les références sont les plus utiles dans une interface public. Les références apparaissent typiquement sur la peau d'un objet, et les pointeurs à l'intérieur.
Une exception à ce qui précède est le cas d'une fonction dont un paramètre ou la valeur de retour a besoin d'une référence "sentinelle". C'est habituellement meilleur fait en retournant/prenant un pointeur, et en donnant au pointeur NULL (ou 0) cette signification spéciale (les références devraient toujours référencer des objets, et non un pointeur NULL déréferencié).
Note: Les programmeurs C de la vieille guarde n'aiment pas parfois les références car ils apportent une sémantique de référence qui n'est pas explicite dans le code de l'appelé. Après un peu d'expérience en C++, cependant; on réalise rapidement que c'est une forme de dissimulation d'information, qui est un actif plutôt qu'un passif. En effet, les programmeurs devraient écrire le code dans le langage du problème plutôt que le langage de la machine.
[ Haut | Bas | Section précédente | Section suivante ]
Ecrire à l'auteur,
au traducteur,
ou en savoir plus sur la traduction.
[ C++ FAQ Lite fr |
Table des matières |
Index |
A propos de l'auteur |
© |
Téléchargez votre propre copie ]
Dernière révision le 12 Nov 2002