À QUOI ÇA SERT ?
Une référence est un alias d’un objet existant.
Elle permet notamment :
- de modifier un objet depuis une fonction ;
- d’éviter une copie ;
- d’exprimer qu’un objet doit exister.
1. RÉFÉRENCE SIMPLE
Code: Select all
int x{10};
int& ref{x};
Code: Select all
ref = 20;
2. DIFFÉRENCE AVEC POINTEUR
Pointeur :
Code: Select all
int* ptr{&x};
Code: Select all
*ptr = 20;
Code: Select all
int& ref{x};
ref = 20;
3. UNE RÉFÉRENCE DOIT ÊTRE INITIALISÉE
Interdit :
Code: Select all
int& ref;
4. ELLE NE PEUT PAS ÊTRE REDIRIGÉE
Code: Select all
int a{1};
int b{2};
int& ref{a};
ref = b;
Cela signifie :
Code: Select all
a = b;
5. PASSAGE PAR RÉFÉRENCE
Code: Select all
void increment(int& x)
{
++x;
}
Code: Select all
int value{10};
increment(value);
Pourquoi ?
Le paramètre x est un alias de value.
6. PASSAGE PAR RÉFÉRENCE const
Code: Select all
void process(const LargeObject& obj)
{
}
Sans référence :
Code: Select all
void process(LargeObject obj)
Avec const& :
- pas de copie ;
- pas de modification.
7. PETITS TYPES
Pour int :
Code: Select all
void f(int x)
Code: Select all
void f(const int& x)
Un int est petit et passe efficacement dans un registre.
La référence peut même ajouter une indirection.
8. RETOUR PAR RÉFÉRENCE
Code: Select all
int& first(std::vector<int>& v)
{
return v[0];
}
Code: Select all
first(v) = 100;
9. ERREUR TRÈS GRAVE
Code: Select all
int& bad()
{
int x{42};
return x;
}
La référence retournée pointe vers un objet qui n’existe plus.
C’est une dangling reference.
10. RÉFÉRENCE VERS POINTEUR
Code: Select all
int* ptr{nullptr};
int*& ref{ptr};
Une fonction peut ainsi modifier l’adresse stockée.
Code: Select all
void allocate(int*& ptr)
{
ptr = new int{42};
}
11. RÉFÉRENCE OU POINTEUR ?
Référence :
quand l’objet doit obligatoirement exister.
Pointeur :
quand nullptr est une valeur logique possible.
Exemple :
Code: Select all
void process(const Buffer& buffer);
Code: Select all
void process(Buffer* buffer);
12. AU NIVEAU MACHINE
Une référence est une abstraction du langage.
Elle est très souvent implémentée comme une adresse transmise de façon similaire à un pointeur.
Mais le standard ne te demande pas de raisonner dessus comme un pointeur réassignable.
À RETENIR
Référence = alias.
Pointeur = variable contenant une adresse.
Ils peuvent avoir des représentations proches en machine, mais leur sémantique C++ est différente.
