2009-07-04 18 views
9

Eventuali duplicati:
Difference between pointer variable and reference variable in C++C++ * vs & a dichiarazione di funzione

Quando dovrei dichiarare il mio variabili come puntatori vs oggetti passati per riferimento? Si compilano allo stesso modo in assembly (almeno in fase di esecuzione asintoticamente), quindi quando dovrei usare quale?

void foo(obj* param) 
void foo(obj& param) 
+2

Dupe di http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c tra molti, molti altri –

risposta

12

La mia regola è semplice: l'uso * quando si vuole dimostrare che il valore è facoltativo e quindi può essere 0.

Escludendo dalla regola: tutte le _obj_s intorno sono conservati in contenitori e si don' t voglio rendere il tuo codice brutto usando dappertutto foo(*value); invece di foo(value); Quindi per mostrare che il valore non può essere 0 metti assert(value); all'inizio della funzione.

3

Un motivo per utilizzare i puntatori è se ha senso passare un valore NULL nella funzione. Con un puntatore, ci si aspetta che sia in grado di farlo. Con un riferimento, non è previsto che sia in grado di farlo.

(Tuttavia, facendo le cose difficili è ancora possibile passare un NULL in un parametro di riferimento. Ci si può aspettare che la funzione chiamata potrebbe bloccarsi in questo caso.)

Un'altra convenzione è che se si passa un puntatore in una funzione, la funzione può utilizzare il puntatore per assumere la proprietà dell'oggetto (specialmente in un ambiente contato di riferimento simile a COM). Se si passa un riferimento, la funzione chiamata può aspettarsi di utilizzare l'oggetto per la durata della chiamata della funzione, ma non di mantenere un puntatore all'oggetto da utilizzare in un secondo momento.

6

Seguo lo Google style guide standard come ha più senso per me. Essa afferma:

All'interno dei parametri della funzione elenca tutti i riferimenti devono essere const:

void Foo(const string &in, string *out); 

In realtà si tratta di un molto forte convenzione nel codice di Google che gli argomenti di input sono valori o riferimenti const mentre gli argomenti di output sono puntatori. I parametri di input possono essere puntatori const, ma non si consentono mai parametri di riferimento non const .

Un caso in cui si potrebbe desiderare un parametro di input di essere un puntatore const è se si vuole sottolineare che l'argomento non viene copiato, quindi deve esistere per la durata dell'oggetto; di solito è meglio documentarlo nei commenti . Gli adattatori STL come bind2nd e mem_fun non consentono i parametri di riferimento , pertanto è necessario specificare le funzioni con i parametri del puntatore anche in questi casi.

+1

Non sono d'accordo con questo punto. Questo è un uso improprio del concetto di riferimento/puntatore nella lingua. I riferimenti servono a garantire in fase di compilazione che un valore sia inizializzato. Questo è un contratto molto forte in cui si afferma che la funzione accetta solo valori inizializzati. Lingue come Java o C# sono carenti, il che costringe gli sviluppatori a verificare se il valore che viene passato sia NULL (null) o meno. Non vedo l'imposizione nel contratto che io possa accettare solo valori const. – ovanes

1

L'altra differenza tra puntatori e riferimenti è che è implicito che non si terrà un riferimento, a meno che non si passi a un costruttore. Passare dei puntatori può significare che un oggetto potrebbe trattenerlo per un po ', come un oggetto modello composito.

0

Un buon motivo per cui utilizzo i puntatori e non i riferimenti nelle applicazioni C++, è la leggibilità. Quando si utilizza un puntatore si vede cosa sta realmente accadendo, e quando si usano i puntatori la sintassi ti dice cosa sta realmente accadendo.

Lo stesso vale per "0" o "NULL". Io preferisco usare "NULL", in questo modo 3 mesi dopo, quando vedo un codice simile:

somevar_1 = 0; 
somevar_2 = NULL; 

So che è un somevar_1int (o float) e somevar_2 è una sorta di puntatore.

Problemi correlati