Arguments de référence

De RAD Studio (Français)

Remonter à Référencement - Index

Le déclarateur de référence peut également être utilisé pour déclarer des paramètres de type référence dans une fonction :



 void func1 (int i);
 void func2 (int &ir);   // ir est du type "référence à int"
     .
     .
     .
 int sum = 3;
 func1(sum);             // somme transmise par valeur
 func2(sum);             // somme transmise par référence



L'argument sum transmis par référence est modifiable directement par func2. En revanche, func1 fournit une copie de l'argument sum (passé par valeur), de sorte que somme elle-même ne peut pas être modifiée par func1.

Lorsqu'un argument réel x est transmis par valeur, l'argument formel correspondant dans la fonction reçoit une copie de x. Toute modification de cette copie dans le corps de la fonction n'est pas répercutée sur la valeur de x en dehors de la portée de la fonction. Naturellement, la fonction peut renvoyer une valeur qui sera ultérieurement utilisable pour modifier x, mais elle ne peut pas directement changer un paramètre passé par valeur.

En C, la modification de la valeur d'un paramètre d'une fonction en dehors de la portée de celle-ci suppose que vous transmettiez l'adresse du paramètre. Celle-ci est transmise par valeur, si bien que la modification du contenu de l'adresse affecte la valeur du paramètre en dehors de la portée de la fonction.

Même si la fonction n'a pas besoin de changer la valeur d'un paramètre, il demeure utile de transmettre l'adresse (ou une référence) à une fonction. Cela est notamment le cas si le paramètre est une structure de données ou un objet volumineux. La transmission d'un objet directement à une fonction nécessite de copier la totalité de l'objet.

Comparez les trois implémentations de la fonction treble :

Implémentation 1



 int treble_1(int n)
 {
    return 3 * n;
 }
   .
   .
   .
 int x, i = 4;= treble_1(i);         // à présent x = 12, i = 4
   .
   .
   .



Implémentation 2



 void treble_2(int* np)
 {
    *np = (*np) * 3;
 }
   .
   .
   .
 treble_2(&i);    // à présent i = 2



Implémentation 3



 void treble_3(int& n)   // n est un type référence
 {
    n = n * 3;
 }
   .
   .
   .
 treble_3(i);             // à présent i = 36



La déclaration de l'argument formel type& t établit t comme type de "référence à type". Ainsi, lorsque treble_3 est appelé avec l'argument réel i, i est utilisé pour initialiser l'argument formel de référence n. n constitue donc un alias de i, de sorte que n = n*3; affecte aussi 3 * i à i.

Si la valeur d'initialisation est une constante ou un objet d'un autre type que référence, C++ crée un objet provisoire pour lequel la référence joue le rôle d'alias :



 int& ir = 6;   /* l'objet int provisoire créé,  avec pour alias ir,  prend la valeur 6*/
 float f;
 int& ir2 = f;  /* crée un objet int provisoire avec ir2 pour alias ; f est converti
                   avant affectation */
 ir2 = 2.0      // à présent ir2 = 2, mais f ne change pas



La création automatique d'objets temporaires permet la conversion de types références lorsque les arguments réels et formels ont des types différents mais compatibles pour l'affectation. Lors du passage par valeur, naturellement, quelques problèmes de conversion se manifestent puisque la copie de l'argument réel peut être physiquement modifiée avant affectation à l'argument formel.

Voir aussi

Autres langues