45 votes

Le déréférencement d'un pointeur en fait-il une copie ?

Le déréférencement d'un pointeur et son passage à une fonction qui prend son argument par référence créent-ils une copie de l'objet ?

8voto

MSalters Points 74024

Dans le cas simple, non. Il existe cependant des cas plus compliqués :

 void foo(float const& arg);
int * p = new int(7);
foo(*p);

Ici, un objet temporaire est créé, car le type du pointeur déréférencé ( int ) ne correspond pas au type de base du paramètre de fonction ( float ). Une séquence de conversion existe et le temporaire converti peut être lié à arg puisqu'il s'agit d'une référence const.

4voto

icecrime Points 23650

Espérons que ce ne soit pas le cas : ce serait le cas si la fonction appelée prenait son argument par valeur.

De plus, c'est le comportement attendu d'une référence :

 void inc(int &i) { ++i; }

int main()
{
    int i = 0;
    int *j = &i;
    inc(*j);
    std::cout << i << std::endl;
}

Ce code devrait afficher 1 car inc prend son argument par référence. Si une copie avait été faite lors de l' inc , le code imprimerait 0 .

3voto

hmuelner Points 5311

Non. Une référence est plus ou moins comme un pointeur avec une notation différente et la restriction qu'il n'y a pas de référence nulle. Mais comme un pointeur, il ne contient que l'adresse d'un objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X