2011-12-26 16 views
6

Quindi sto cercando di imparare il C++ e mi sono imbattuto in qualcosa che mi imbarazza leggermente. Ho il codice,Chiarimento dei riferimenti in C++

int x = 0; 
int &y = x; 
cout << &x<< " " << x << " " << &y << " " <<y<< endl; 

Questo compila bene e si traduce in:

0 003AFA08 0 003AFA08 

Quello che ho difficoltà a capire perché la conversione di x, int, a & y, un riferimento, non fa causare un errore. In un primo momento ho pensato che fosse una sorta di conversione tuttavia,

int &y = &x; 

genera un errore.

Qualcuno può spiegare perché questo funziona in questo modo? Grazie in anticipo.

+0

Quindi si vuole sapere perché l'operatore di inserimento del flusso '' 'può stringificare l'indirizzo di una variabile come una stringa esadecimale numerica ma non si può assegnare l'indirizzo di un' int' (con tipo 'int *') a 'int &'? – bobbymcr

+3

Immagino che sia '003AFA08 0 003AFA08 0' – onemach

risposta

11

int& non è un indirizzo. È un riferimento .

int& y = x; dichiara come riferimento a x. Significa in effetti che diventa un altro nome per x. Ogni volta che usi y, è come se avessi detto x.

I puntatori (non i riferimenti) vengono utilizzati per memorizzare gli indirizzi. int& y = &x; non è valido perché &x è l'indirizzo di x (è un int*). y è un riferimento a un int, non un riferimento a un int*.

+1

Grazie a te che ho appena reso C++ molto più sensato ... – jozefg

+0

In senso stretto,' & x' non è l'indirizzo * di * 'x', ma un * puntatore a *' x', anche se l'operatore '' viene chiamato * indirizzo-di * :) – fredoverflow

+1

@FredOverflow: "Un valore valido di un tipo di puntatore oggetto rappresenta l'indirizzo di un byte in memoria o un puntatore nullo." Abbastanza vicino per me. :) – GManNickG

5

Non è una conversione. Quando si dispone di un tipo variabile di T & in cui T è un tipo casuale, si sta sostanzialmente dicendo "Sto dichiarando un nome che è un alias per un altro nome o forse un valore anonimo.". È più simile a typedef di un puntatore.

I riferimenti spesso vengono implementati come indirizzi, ma non è un buon modello per pensare a quello che sono.

Nel tuo esempio che si sta perplesso:

int * const &y = &x; 

avrebbe funzionato bene. Quindi diventa un alias per il risultato temporaneo di prendere l'indirizzo di x. Si noti che è un riferimento a un puntatore. Deve essere un riferimento a un puntatore costante perché è un riferimento a un valore temporaneo.

1

Il tuo problema è che &y non è semplicemente un indirizzo, ma un riferimento. Ciò significa che si comporta come una copia di x. Non converte e in realtà sta diventando un altro nome per x.

2

&y non è solo un indirizzo, è un riferimento. Ciò significa che

int &y = x; 

fa un clone del x con il nome di y.