Newsgroup: it.comp.lang.c++
Titolo: Reference o puntatori ?

Salve a tutti. Qualcuno mi sa spiegare le differenze tra un puntatore e un
reference ?
E magari quando è preferibile usare l'uno o l'altro.
Grazie
Simone

Simone wrote:

Un reference è un "alias" per un oggetto:
int a = 10; 
int &b = a;
dopo questa dichiarazione, ogni modifica di b equivarrà ad una modifica di 
a, in quanto in pratica sono lo stesso oggetto.
Ad esempio puoi usare un reference per passare un parametro ad una funzione 
che debba modificarne il valore:
int foo(int &a) {return ++a;}
quando passi una variabile intera alla funzione foo, all'uscita l'intero 
sarà incrementato.
In genere, se la funzione deve modificare il valore passato, è meglio usare 
un puntatore, per evitare incomprensioni. E' comunque utile usare un 
reference (costante) se l'oggetto che passi è una classe di grandi 
dimensioni: in tal caso nel passaggio non viene fatta una copia 
dell'oggetto.
E' poi utile usare i reference quando sovraccarichi gli operatori (non 
tutti, però): ad esempio, se devi scrivere l'operator= per una tua classe, 
la sua dichiarazione potrebbe essere:
MyClass& operator=(MyClass& rhs);
in questo modo puoi concatenare più assegnazioni:
a = b = c;
viene letto come 
(a.operator=(b.operator=(c));
Ciao,
Cecco

 ha scritto nel messaggio
news:hZND8.51456$zW3.6...@news1.tin.it...


 E magari quando è preferibile usare l'uno o l'altro.
Un reference e` di fatto un puntatore con le seguenti differenze:
1) quando ne dichiari uno devi subito assegnarlo, cioe`:
int &i; NO
int &i=3; SI
2) Una volta che gli assegni un valore non lo puoi piu` cambiare.
3) Non devi dereferenziarlo perche` lo fa il linguaggio in automatico.
In pratica sono stati creati per consentire i vantaggi dei puntatori (muovi
un indirizzo, non una struttura intera che e` di solito molto piu` pesante!)
senza gli svantaggi dei medesimi (conflitti, dangling pointer e compagnia
bella).
Sono comodi negli argomenti dei metodi, tipo:
class matrice;
class immagine;
class filmato;
class prova{
...
  filmato& costruisci(immagine& imm, matrice& mat){
    ...
  }
...
}
cosi` le chiamate al metodo costruisci saranno abbastanza leggere nonostante
il nome degli oggetti che passo suggerirebbe strutture piuttosto
impegnative.
I puntatori li userai solo quando dovrai fare delle cose che non si possono
fare se non coi puntatori, ma possibilmente mai. Poca esperienza di
programmazione in C++ basta per convincersi che anche il programmatore piu`
coscienzioso e prudente puo` rimanere intrappolato nel vortice dei puntatori
che si arrotolano, poi ti voglio vedere a fare il debug (non parliamone se
devi prendere in mano un programma fatto da altri!!!)
Ciao
Roberto

 usare un puntatore, per evitare incomprensioni. E' comunque utile usare
non sono per nulla d'accorda con questa frase; spesso l'uso di reference 
per modificare il parametro passato permette di *migliorare* la 
leggibilita` del codice, anziche` creare confusione.
La stessa libreria standard ci fornisce degli esempi in questo senso; i 
primi che mi vengono in mente sono:
1) gli operator>> degli stream di input
2) gli operator<< degli stream di output
3) la funzione std::swap
Tieni presente che un passaggio per puntatore implica anche una certa 
cautela da parte della funzione chiamata, che deve controllare se esso 
e` nullo oppure no. IMHO in genere se esiste la possibilita` che il 
parametro sia nullo uso un puntatore, altrimenti un reference.
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.73, higher than 99% of all previous test takers.
C Language: 3.79, higher than 92% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it