PDA

Visualizza la versione completa : [c++]Capire bene riferimenti


giuseppe500
20-11-2008, 10:07
ciao.
Ho una mezza lacuna sui riferimenti , li uso ma mi sono fermato a dire:prova a scrivere cosa sono , e li' ho capito che non li ho ancora compresi a fondo.sono abituato ad usarli nella dichiarazione dei parametri delle funzioni per far si che i cambiamenti all'interno della funzione persistano anche all ' esterno ad es semplificato:



void change(*p1,*p2)
{
*p1=1;
*p2=2;
}

main
{
int p1,p2;
p1=p2=0;

change(&p1,&p2)
//p1=1 ,p2 = 2
}


un altro caso in cui si usano i riferimenti è il costruttore di copia:


class Z
{
public:
Z();
Z(Z& other);

}
di cui non riesco bene a capire la sintassi:
"passa il riferimento di un oggetto gia' esistente di tipo Z" ???
è cosi?perchè?...
ho capito il fatto del gia esistente , in quanto questo costruttore serve innanzitutto per fare la deep copy di un oggetto a partire da un altro oggetto dello stesso tipo , e si rende esplicito nei casi non si abbiano oggetti solo con tipi primitivi(come int o char), ad es se ho dei puntatori nella mia classe o delle allocazioni di memoria dinamiche in generale

un altro caso che non ho capito bene è questo:
z(Z*& varPar)
in cui mi avete aiutato gia' abbondantemente su questo forum , ma che non ho ancora assimilato del tutto.

Grazie.

Stoicenko
20-11-2008, 10:40
un riferimento altro non è che un puntatore ad un oggetto.. es:



int i = 1;

se ho una funzione che prende in input un int* allora farò così:


void foo(int* intero)

la chiamerò con:


foo(&i); <- qui passo un riferimento al mio intero alla funzione.. questo riferimento, nella funzione foo, diventa un puntatore al mio intero..


il costruttore di copia si comporta proprio al contrario..
si aspetta un riferimento per non averne una copia locale (un oggetto passato per valore viene copiato localmente alla funzione e non viene modificato)

quindi:


oggetto(const oggetto& o); <- costruttore di copia

chiamato con:


oggetto ogg(o); <- "o" è un oggetto esistente


però attenzione queste cose dovresti studiartele meglio sul/sui libro/i

Stoicenko
20-11-2008, 10:46
z(Z*& varPar)

vediamo se ricordo il trucco per vapire meglio queste cose:



prendi il nome e salta a destra e a sinistra switchando di uno per capirne il tipo


nel tuo esempio:

varPar è, vado a sinistra di 1
un riferimento (&), ora a destra ma non c'è nulla quindi di nuovo a sinistra
ad un puntatore (*), ora di nuova a sx perchè a dx non c'è nulla
a Z

molto utile quando hai puntatori ad arry costanti ecc...

Loading