web-dev-qa-db-fra.com

Passer par pointeur et passer par référence

Duplicata possible:
Quelles sont les différences entre la variable pointeur et la variable de référence en C++?
Y a-t-il des avantages à passer par un pointeur plutôt qu'à passer par référence en C++?

Dans les deux cas, j'ai atteint le résultat. Alors, quand est-ce que l'un est préféré à l'autre? Quelles sont les raisons pour lesquelles nous utilisons l'un sur l'autre?

#include <iostream>
using namespace std;
void swap(int* x, int* y)
{
    int z = *x;
    *x=*y;
    *y=z;
}
void swap(int& x, int& y)
{
    int z = x;
    x=y;
    y=z;
}

int main()
{
    int a = 45;
    int b = 35;
    cout<<"Before Swap\n";
    cout<<"a="<<a<<" b="<<b<<"\n";

    swap(&a,&b);
    cout<<"After Swap with pass by pointer\n";
    cout<<"a="<<a<<" b="<<b<<"\n";

    swap(a,b);
    cout<<"After Swap with pass by reference\n";
    cout<<"a="<<a<<" b="<<b<<"\n";
}

Sortie

Before Swap
a=45 b=35
After Swap with pass by pointer
a=35 b=45

After Swap with pass by reference
a=45 b=35
41
cppcoder

Une référence est sémantiquement la suivante:

T& <=> *(T * const)

const T& <=> *(T const * const)

T&& <=> [no C equivalent] (C++ 11)

Comme pour les autres réponses, les éléments suivants du C++ FAQ est la réponse sur une ligne: références lorsque cela est possible, pointeurs lorsque cela est nécessaire).

Un avantage sur les pointeurs est que vous avez besoin d'une conversion explicite pour passer NULL. C'est toujours possible, cependant. Parmi les compilateurs que j'ai testés, aucun n'émet d'avertissement pour les éléments suivants:

int* p() {
    return 0;
}
void x(int& y) {
  y = 1;
}
int main() {
   x(*p());
}
26
moshbear

En fait, la plupart des compilateurs émettent le même code pour les deux appels de fonctions, car les références sont généralement implémentées à l'aide de pointeurs.

Suivant cette logique, lorsqu'un argument de type de référence (non-const) est utilisé dans le corps de la fonction, le code généré fonctionnera simplement en silence sur l'adresse de l'argument et il le déréférencera. En outre, lorsqu'un appel à une telle fonction est rencontré, le compilateur génère du code qui transmet l'adresse des arguments au lieu de copier leur valeur.

Fondamentalement, les références et les pointeurs ne sont pas très différents du point de vue de la mise en œuvre la principale différence (et très importante) réside dans la philosophie: ne référence est l'objet lui-même, juste avec un nom différent.

Les références ont quelques avantages supplémentaires par rapport aux pointeurs (par exemple, elles ne peuvent pas être NULL, donc elles sont plus sûres à utiliser). Par conséquent, si vous pouvez utiliser C++, le passage par référence est généralement considéré comme plus élégant et devrait être préféré. Cependant, en C, il n'y a pas de passage par référence, donc si vous voulez écrire du code C (ou, horribile dictu, du code qui se compile à la fois avec un compilateur C et C++, bien que ce ne soit pas une bonne idée), vous devrez limitez-vous à utiliser des pointeurs.

6
user529758

Ici est un bon article sur le sujet - "Utilisez des références quand vous le pouvez et des pointeurs quand vous le devez."

4
Rocky

Passer par le pointeur est la seule façon de passer "par référence" en C, vous voyez donc qu'il est assez utilisé.

Le pointeur NULL est une convention pratique pour dire qu'un paramètre n'est pas utilisé ou n'est pas valide, utilisez donc un pointeur dans ce cas.

Les références ne peuvent pas être mises à jour une fois qu'elles sont définies, utilisez donc un pointeur si vous avez besoin de les réaffecter.

Préférez une référence dans tous les cas où il n'y a pas de bonne raison de ne pas le faire. Faites-le const si vous le pouvez.

4
Mark Ransom

Utilisez des références tout le temps et des pointeurs uniquement lorsque vous devez vous référer à NULL, référence qui ne peut pas faire référence.

Voir ceci FAQ: http://www.parashift.com/c++-faq-lite/references.html#faq-8.6

2
Sanish