Programmation • IoT

Chap 2 – Les références

Document réservé

Vous consultez actuellement la présentation publique de ce chapitre.

Les documents PDF complets, comprenant les développements théoriques, les exemples détaillés et les exercices, sont disponibles sur demande.

Pour obtenir un accès, contactez-moi via la page Contact en indiquant les domaines qui vous intéressent (C++, ESP-IDF, électronique, etc.).

Chapitre 2 – Les références 2 Chapitre 2 – Les références 2.1 Prérequis, nouvelles notions et objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Les références constantes (const) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Pourquoi les références existent-elles ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.9 Réponses aux questions de réflexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accueil
Chapitre 2 – Les références Chapitre 2 – Les références Prérequis, nouvelles notions et objectifs 2. Adresse mémoire. 3. Référence constante (const). • Qu’est-ce qu’une référence ? • Pourquoi parle-t-on d’alias ? • Une référence possède-t-elle sa propre mémoire ? • Une référence possède-t-elle une adresse ? • Peut-on modifier la variable originale via une référence ? • Une référence peut-elle être réaffectée ? • À quoi sert une référence constante ? Programme 1 — Une référence Programme 1 – Référence std::cout << « Etat initial\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; std::cout << « \nApres : a = 15\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’;
Accueil
Chapitre 2 – Les références std::cout << « \nApres : r = 42\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; Programme 2 – Sortie Une référence est un alias Une référence ne “prend” pas la valeur d’une variable. Elle devient un second nom désignant exactement le même Référence et mémoire Fig. 1 – Illustration au niveau de la mémoire. Une seule case mémoire est partagée par les deux identificateurs. Les références constantes (const) Reprenons le programme ci-dessous et déclarons la référence comme étant constante. std::cout << « Etat initial\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’;
Accueil
Chapitre 2 – Les références std::cout << « \nApres : a = 15\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; // Erreur de compilation std::cout << « \nApres : r = 42\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; Le résultat nous montre qu’il est impossible de changer la valeur de r. La référence ne peut pas être affectée à une autre valeur. Le compilateur n’accepte pas l’instruction d’affectation. Pourquoi les références existent-elles ? Les références permettent de donner un second nom à un objet existant, sans effectuer de copie. Lorsqu’une référence est déclarée constante, elle ne permet que la lecture de l’objet auquel elle est liée. Cette propriété est particulièrement utile lors de l’appel des fonctions : la fonction peut accéder directement à l’objet original sans en faire une copie, tout en étant incapable de le modifier. Mais alors que se passe t’il si on affecte une autre valeur à a après coup, que va devenir r ? std::cout << « Etat initial\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; std::cout << « \nApres : a = 15\n »; std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; Le résultat après compilation et exécution est : Programme 3 – Programme C++ vraiment minimal
Accueil
Chapitre 2 – Les références Donc le programme s’exécute sans erreur. En résumé, une référence constante interdit uniquement les modifications effectuées à travers cette référence. Elle ne rend pas l’objet lui-même constant. Ainsi, dans notre exemple, l’instruction est parfaitement autorisée. En revanche, l’instruction est refusée par le compilateur, car elle tenterait de modifier l’objet au moyen d’une référence déclarée constante. ✓ Une référence est un second nom donné à un objet existant. ✓ Une référence doit être initialisée lors de sa création. ✓ Une référence ne peut pas être réaffectée à un autre objet. ✓ Une référence constante interdit les modifications effectuées à travers cette référence. ✓ Une référence constante ne rend pas l’objet lui-même constant. Questions de réflexion 1. Une référence occupe-t-elle de la mémoire ? 2. Peut-on créer une référence sans objet ? 3. Peut-on faire en sorte qu’une référence désigne ensuite un autre objet ? 4. Quelle est la différence entre une référence et un pointeur ? Réponses aux questions de réflexion 1. Une référence occupe-t-elle de la mémoire ? Réponse : Non de la référence sur une valeur. Demandons à un petit bout de code l’adresse Programme 4 – Adresse d’une référence std::cout << « &a =  » << &a << ’\n’; std::cout << « &r =  » << &r << ’\n’; Programme 5 – Sortie.
Accueil
Chapitre 2 – Les références Les deux adresses sont identiques. Une référence ne désigne pas un nouvel objet ; demander son adresse revient donc à demander l’adresse de l’objet auquel elle est liée. Conceptuellement, une référence n’est pas un nouvel objet : c’est un alias. Son implémentation est laissée au compilateur, qui est libre d’utiliser ou non de la mémoire supplémentaire. 2.Peut-on créer une référence sans objet ? Réponse : Non Une référence sur un objet nécessite un objet déjà 3. Peut-on faire en sorte qu’une référence désigne ensuite un autre objet ? Réponse : Non Programme 6 – Programme C++ vraiment minimal std::cout << « a =  » << a << ’\n’; std::cout << « r =  » << r << ’\n’; dont la sortie est : Programme 7 – Programme C++ vraiment minimal On se dit que oui, puisque r=20, mais ce n’est pas le cas ! C’est la valeur de a que r a transformé lors de l’affectation r = b;. C’est a qui vaut 20 à présent car r lui a affecté la valeur de b. r fait toujours référence à a. 4. Quelle est la différence entre une référence et un pointeur ? Une référence est un second nom donné à un objet existant. Une fois créée, elle reste liée à cet objet pendant toute sa durée de vie. Elle ne peut jamais être réaffectée à un autre objet et doit obligatoirement être initialisée lors de sa déclaration. Un pointeur est, quant à lui, une variable dont la valeur est une adresse mémoire. Il peut être modifié pour désigner successivement plusieurs objets différents et peut également ne désigner aucun objet (pointeur nul). Les deux notions permettent donc d’accéder indirectement à un objet, mais leur philosophie est très différente. Une référence représente un alias permanent, alors qu’un pointeur représente une adresse pouvant être manipulée. Le chapitre suivant sera entièrement consacré aux pointeurs et montrera pourquoi ils constituent l’un des mécanismes les plus puissants du langage C++.
Accueil
Chapitre 2 – Les références Est un alias d’un objet existant. Est une variable contenant une adresse mémoire. Doit être initialisée lors de sa déclaration. Peut être initialisé plus tard (ce qui est généralement déconseillé). Ne peut jamais être réaffectée à un autre Peut désigner successivement plusieurs objets. Ne peut pas être nulle. Peut valoir nullptr. S’utilise comme l’objet lui-même. Nécessite un déréférencement (∗) pour accéder à l’objet pointé. Table 1 – Comparaison entre une référence et un pointeur.
Accueil
cpp-Chap2- Chapitre 2 – Les références
Accueil
Contenu

Inscription

×
Cancel