Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Références

En C pour faire un swap, on écrit

    void swap(int* p, int* q) {
        int tmp = *p;
        *p = *q;
        *q = tmp;
    }

    int x, y;
    swap(&x, &y)

Soucis avec les pointeurs

Le soucis des pointeurs c’est :

  • c’est moche *p + *q au lieu du naturel x + y ;
  • on peut modifier à la fois p et *p donc trop de bugs ;
  • on peut avoir un pointeur null ou qui pointe vers n’importe quoi
  • C’est mieux de directement manipuler des objets Point p et non pas Point* p car ça appelle le destructeur quand la mémoire est libérée

Pour cela, il propose les références.

Définition d’une référence

Une référence est un nouveau nom pour désigner un objet existant.

void swap(int& i, int& j)
{
    int tmp = i;
    i = j;
    j = tmp;
}

int x, y;
swap(x, y);

L’implémentation derrière la scène est la même que les pointeurs. Mais c’est une vision technique. On peut vraiment voir ça comme un nouveau nom.

Exercices

  • Que vaut x à la fin du programme suivant ?
int x = 4;
int& y = x;
y = 5;
Il vaut 5. Car en vrai, c'est la même chose que :
int x = 4;
int py = &x;
*py = 5;
  • Que pensez-vous de ce programme ?
int& getRef() {
    int x = 42;
    return x;
}

int main() {
    int& r = getRef();
    std::cout << r << std::endl;
}
Malheureusement, ce programme peut planter ou écrire n'importe quoi. En effet, on renvoie une référence vers la variable `x` dans la pile d'appel, variable qui n'existe plus.

Voir aussi

[https://isocpp.org/wiki/faq/references]