2011-12-20 15 views
37

Possible Duplicate:
What are the differences between pointer variable and reference variable in C++?
Are there benefits of passing by pointer over passing by reference in C++?Passare da puntatore e Pass con riferimento

In entrambi i casi, ho raggiunto il risultato. Quindi quando si preferisce l'altro? Quali sono i motivi per cui usiamo l'uno sull'altro?

#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"; 
} 

uscita

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 
+0

http://stackoverflow.com/questions/114180/pointer-vs-reference –

+0

[Ci sono vantaggi del passaggio del puntatore al passaggio per riferimento in C++?] (Http://stackoverflow.com/q/334856/ 187543) – cpx

risposta

23

Un riferimento è semanticamente il seguente:

T& <=> *(T * const)

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

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

Come per altre risposte, la risposta alle domande frequenti su C++ è la risposta su una sola riga: riferimenti quando possibile, indicatori quando necessario.

Un vantaggio rispetto ai puntatori è che è necessario il cast esplicito per passare NULL. È ancora possibile, però. dei compilatori che ho provato, nessuno emettono un avvertimento per il seguente:

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

I riferimenti non limitano l'oggetto di riferimento a fare riferimento a qualcosa di valido. È possibile restituire un riferimento a una variabile locale, ad esempio. –

+1

È possibile ottenere un riferimento non valido se si denota un puntatore NULL, quindi è necessario fare attenzione nel codice chiamante. Vedi http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c/57656#57656 –

+0

È possibile, ma a meno che non si stia puntatori non controllati, quindi non dovrebbe accadere. E se non controlli i puntatori prima di dereferenziarli, allora ho notizie per te ... – moshbear

4

Passo dal puntatore è l'unico modo per passare "per riferimento" in C, quindi è ancora lo vedono usato un bel po ' .

Il puntatore NULL è una comoda convenzione per dire che un parametro non è utilizzato o non è valido, quindi utilizzare un puntatore in questo caso.

I riferimenti non possono essere aggiornati una volta impostati, quindi utilizzare un puntatore se è necessario riassegnarlo.

Preferire un riferimento in tutti i casi in cui non vi è una buona ragione per non farlo. Rendilo const se puoi.

6

Infatti, la maggior parte dei compilatori emettono lo stesso codice per entrambe le chiamate di funzioni, poiché i riferimenti vengono generalmente implementati utilizzando i puntatori.

Seguendo questa logica, quando un argomento di tipo di riferimento (non const) viene utilizzato nel corpo della funzione, il codice generato opererà silenziosamente sull'indirizzo dell'argomento e lo deniverà. Inoltre, quando si incontra una chiamata a tale funzione, il compilatore genererà il codice che passa l'indirizzo degli argomenti invece di copiarne il valore.

Fondamentalmente, riferimenti e puntatori non sono molto diversi da un punto di vista implementativo, principale (e molto importante) differenza è nella filosofia: un riferimento è l'oggetto stesso, solo con un nome diverso.

I riferimenti presentano un paio di ulteriori vantaggi rispetto ai puntatori (ad esempio, non possono essere NULL, quindi sono più sicuri da utilizzare). Di conseguenza, se puoi usare C++, il passaggio per riferimento è generalmente considerato più elegante e dovrebbe essere preferito. Comunque, in C, non c'è passaggio per riferimento, quindi se vuoi scrivere codice C (o, dictu orribile, codice che compila con un compilatore C e un C++, anche se non è una buona idea), dovrai limitati a usare i puntatori.

4

Here è un buon articolo sulla questione - "Utilizzare i riferimenti quando si può, e puntatori quando si deve."

Problemi correlati