[8] Références
(Une partie de C++ FAQ Lite fr, Copyright © 1991-2002, Marshall Cline cline@parashift.com )

Traduit de l'anglais par Jérôme Lecomte

Les FAQs de la section [8]


[8.1] Qu'est-ce qu'une référence?

Un alias (un autre nom) pour un objet.

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 ]


[8.2] Qu'est-ce qui se produit si j'affecte une référence?

Vous changez le referent (l'objet auquel la référence se réfère).

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 ]


[8.3] Qu'est-ce qui se produit si je renvoie une référence?

L'appel de fonction peut apparaître du côté gauche d'un opérateur d'affectation (operator=).

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 ]


[8.4] Comment puis-je changer le référent d'une référence pour la faire se rapporter à un objet différent?

Aucune moyen.

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 ]


[8.5] Quand dois-je utiliser des références, et quand dois-je utiliser des pointeurs?

Utilisez les références quand vous pouvez, et les pointeurs quand vous devez.

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 ]


E-mail Marshall Cline 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