PDA

Visualizza la versione completa : [C++] by using pointers / by references


GliderKite
23-10-2010, 12:50
Quali sono le principali differenze del passaggio di argomenti a funzione tramite puntatore piuttosto che tramite riferimento?
Quando è meglio preferire l'utilizzo di un metodo piuttosto che dell'altro?

Io per ora mi sono sempre attenuto a questo:
"For the combined reasons of clarity and performance, many C++ programmers prefer that modifiable arguments be passed to functions by using pointers, small nonmodifiable arguments be passed by value and large nonmodifiable arguments be passed to functions by using references to constants."

Opinioni?

p91paul
23-10-2010, 19:12
allora sostanzialmente la referenza è più comoda da usare se non devi lavorare sul puntatore....
nel senso che se passi una struttura, se passi un puntatore devi usare -> per accedere ai suoi valori; se usi un reference basta il .

Tuttavia, con il tempo ci si accorge che occorre definire uno standard, per permettere ad altri (o anche a noi stessi a distanza di tempo) di capire il codice che abbiamo scritto.

Per questo è preferibile utilizzare i puntatori perchè, anche nella chiamata della funzione risulti evidente che quella funzione modificherà il valore della variabile passata.

Per esempio:



typedef struct esempio{....};
struct esempio prova;

void funzionepunt(struct esempio *punt){....}

void funzioneref(struct esempio &ref){.....}

int main(){
// si capisce che passa un puntatore, e che quindi ci sarà la modifica di prova
funzionepunt(&prova);
//è uguale alla chiamata con passaggio per valore
//leggendo si potrebbe capire che prova è passata per valore e che quindi non verrà modificata dalla funzione
funzioneref(prova);
}



spero si capisca quello che intendo.

simo_85
23-10-2010, 21:27
Originariamente inviato da GliderKite
Quali sono le principali differenze del passaggio di argomenti a funzione tramite puntatore piuttosto che tramite riferimento?Nessuna? :stordita:

MItaly
24-10-2010, 15:50
Originariamente inviato da p91paul
Per questo è preferibile utilizzare i puntatori perchè, anche nella chiamata della funzione risulti evidente che quella funzione modificherà il valore della variabile passata.

Non sono d'accordo; i reference hanno a loro volta una serie di vantaggi dalla loro. In primo luogo, un parametro reference consente di evitare di usare l'odiosa sintassi var-> o (*var). necessaria per accedere ai membri di una variabile passata per puntatore; inoltre l'uso dei reference consente di utilizzare oggetti che dispongono di operatori in overload senza doverli dereferenziare.
Inoltre i reference rendono evidente la semantica di proprietà dell'oggetto passato: dal momento che la funzione chiamata riceve un riferimento, sa con certezza che non tocca a lei deallocarlo; inoltre ad un riferimento non è possibile passare NULL senza andare nella landa dell'undefined behavior, per cui è evidente che il parametro in questione non è opzionale e non ci si può passare NULL.
Infine, l'uso dei const reference consente di combinare i vantaggi del passaggio per valore (la variabile originale non viene modificata, non serve * e -> per accedere ai membri) e l'efficienza del passaggio per puntatore (non vengono effettuate copie che in caso di oggetti "pesanti" possono essere onerose).

Loading