2011-12-26 22 views
6

Próbuję więc poznać C++ i natknąłem się na coś, co mnie zastanawia. Mam kod,Wyjaśnienie odniesień w C++

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

To kompiluje i wyniki w:

0 003AFA08 0 003AFA08 

Co mam kłopoty ze zrozumieniem, dlaczego konwersja x, int, aby & y, punkt odniesienia, nie powoduje błąd. Najpierw myślałem, że to była jakaś konwersja jednak wyniknie błąd.

Czy ktoś może wyjaśnić, dlaczego to działa w ten sposób? Z góry dziękuję.

+0

Więc chcesz wiedzieć, dlaczego operator wstawiania strumienia '<<' może uszeregować adres zmiennej jako numeryczny łańcuch szesnastkowy, ale nie możesz przypisać adresu 'int' (z typem' int * ') do 'int &'? – bobbymcr

+3

Domyślam się, że to '003AFA08 0 003AFA08 0' – onemach

Odpowiedz

11

int& to nie jest adres. Jest to odniesienie.

int& y = x; deklaruje y jako odniesienie do x. Oznacza to, że y staje się inną nazwą dla x. Za każdym razem, gdy używasz y, jest tak, jakbyś powiedział: x.

Do przechowywania adresów używane są wskaźniki (bez odnośników). int& y = &x; nie jest ważny, ponieważ &x to adres x (jest to int*). y jest odniesieniem do int, a nie odniesieniem do int*.

+1

Dziękuję, że właśnie C++ ma o wiele więcej sensu ... – jozefg

+0

Ściśle mówiąc,' & x' nie jest * adresem * 'x', ale * wskaźnikiem na *' x', mimo że operator '&' nazywa się * address-of * :) – fredoverflow

+1

@FredOverflow: "Prawidłowa wartość typu wskaźnika obiektu reprezentuje adres bajtu w pamięci lub wskaźnik zerowy." Wystarczająco blisko dla mnie. :) – GManNickG

5

To nie jest konwersja. Gdy masz typ zmiennej T &, gdzie T jest typem losowym, mówisz "deklaruję nazwę, która jest aliasem dla innej nazwy lub ewentualnie wartości anonimowej.". Jest bardziej podobny do wskaźnika niż typedef.

Referencje często są zaimplementowane jako adresy, ale to nie jest dobry model do myślenia o tym, czym są.

W swoim przykładzie, że jesteś zaskoczony:

int * const &y = &x; 

będzie działać dobrze. Wtedy y staje się aliasem dla tymczasowego wyniku przyjęcia adresu x. Zauważ, że jest to odniesienie do wskaźnika. Musi to być odniesienie do stałego wskaźnika, ponieważ jest odniesieniem do wartości tymczasowej.

1

Twój problem polega na tym, że &y to nie tylko adres, ale referencja. Oznacza to, że zachowuje się jak kopia x. Nie konwertuje się i staje się inną nazwą dla x.

2

&y to nie tylko adres, to referencja. Oznacza to, że

int &y = x; 

sprawia klon x o imieniu y.