Les références
Lorsqu’un objet est créé, il est associé à une référence qui permet de le retrouver en mémoire. C’est cette référence qui est placée dans votre variable. Un même objet peut avoir plusieurs références, c’est généralement ce qu’il se passe lorsque vous utilisez l’opérateur d’affectation \( = \). Le même objet en mémoire peut donc être accessible via plusieurs variables différentes. Pour que ce mécanisme fonctionne, les langages de programmation utilisent habituellement ce que l’ont appel un compteur de référence. Celui-ci indique le nombre de références qui pointent vers lui. Ce compteur augmente dès que vous copiez la référence de l’objet. Dans l’exemple ci-dessous, nous avons notre compteur de référence qui monte à 3.
unVehicule <- Vehicule("rouge", "Renault", 400) uneVoitureRouge <- unVehicule laVoitureDeMonVoisin <- uneVoitureRouge
unVehicule = Vehicule("rouge", "Renault", 400) uneVoitureRouge = unVehicule laVoitureDeMonVoisin = uneVoitureRouge
// Sans compteur de référence: Vehicule unVehicule("rouge", "Renault", 400); Vehicule& uneVoitureRouge = unVehicule; Vehicule& laVoitureDeMonVoisin = uneVoitureRouge; // Avec compteur de référence: auto unVehicule = std::make_shared<Vehicule>("rouge", "Renault", 400); auto uneVoitureRouge = unVehicule; auto laVoitureDeMonVoisin = uneVoitureRouge;
Vehicule unVehicule = new Vehicule("rouge", "Renault", 400); Vehicule uneVoitureRouge = unVehicule; Vehicule laVoitureDeMonVoisin = uneVoitureRouge;
Il est important de comprendre que si vous modifiez l’une des variables d’un objet, cette modification sera visible par toutes les références à cet objet. En d’autres termes, l’opérateur d’affectation ne crée pas une copie complète de l’objet, mais fait une copie de la référence. Par exemple, dans le code ci-dessous, si vous modifiez la variable “couleur” de l’objet via la variable “uneVoitureRouge”, cette modification sera également visible sur la variable “unVehicule”, car les deux variables pointent vers le même objet en mémoire.
unVehicule <- Vehicule("rouge", "Renault", 400) uneVoitureRouge <- unVehicule uneVoitureRouge.couleur <- "bleue" AFFICHER "Couleur de unVehicule: ", unVehicule.couleur AFFICHER "Couleur de uneVoitureRouge: ", uneVoitureRouge.couleur
unVehicule = Vehicule("rouge", "Renault", 400) uneVoitureRouge = unVehicule uneVoitureRouge.couleur = "bleue" print("Couleur de unVehicule: ", unVehicule.couleur) print("Couleur de uneVoitureRouge: ", uneVoitureRouge.couleur)
Vehicule unVehicule("rouge", "Renault", 400); Vehicule& uneVoitureRouge = unVehicule; uneVoitureRouge.couleur = "bleue"; cout << "Couleur de unVehicule: " << unVehicule.couleur << endl; cout << "Couleur de uneVoitureRouge: " << uneVoitureRouge.couleur << endl;
Vehicule unVehicule = new Vehicule("rouge", "Renault", 400); Vehicule uneVoitureRouge = unVehicule; uneVoitureRouge.couleur = "bleue"; Console.WriteLine("Couleur de unVehicule: " + unVehicule.couleur); Console.WriteLine("Couleur de uneVoitureRouge: " + uneVoitureRouge.couleur);