2013-05-10 20 views
5

Przechodzę po koncepcjach odniesienia w języku C++ i jestem trochę zdezorientowany tym stwierdzeniem w C++ Complete Reference.Odwołanie do odniesienia w C++

nie można odwołać innego odniesienia

Więc co dzieje się w tym przypadku:

int var = 10; 
    int& ref = var; 
    int& r_ref = ref; 
    r_ref++; 
    cout << "var:" << var << "ref:" << ref << "r_ref:" << r_ref << endl; 

Wyjście otrzymuję jest:

var:11 ref:11 r_ref:11 
+3

Kod, który napisałeś, nie odnosi się do innego źródła (np. 'Int &&'). Odwołujesz się do zmiennej dwukrotnie.Kod jest więc w porządku. – deepmax

Odpowiedz

10

To nieco myląco sformułowany . Chodzi o to, że nie możesz mieć typu int& & (zauważ, że istnieje coś takiego jak int&&, ale jest to inny typ odniesienia).

W swoim kodzie odniesienie ref odnosi się do obiektu oznaczonego var. Nazwy ref i var mogą być używane zamiennie w celu odniesienia do tego samego obiektu. Więc kiedy robisz int& r_ref = ref;, nie odwołujesz się do referencji, ale ponownie robisz odniesienie do tego samego obiektu.

+0

Jeśli odniesienie do odniesienia jest traktowane jako int & & wtedy jego ok. – Daemon

+0

Jeszcze jedno ** nie możemy uzyskać adresu zmiennej referencyjnej **. Ale jak ref tutaj odnosi się do var, jestem w stanie wydrukować i ref. Więc możesz to wyjaśnić. – Daemon

+1

@Guarav Tak, kiedy wykonujesz '& ref', faktycznie przyjmujesz adres obiektu, do którego się odnosi. Nie możesz wziąć adresu samego odniesienia. W rzeczywistości nie jest określone, czy samo odniesienie istnieje nawet w pamięci. –

6

Więc co dzieje się w tym przypadku:

Co się dzieje jest to, że podczas tworzenia innego odniesienia r_ref do obiektu wskazywanego przez ref, który jest var. Tak więc kończy się to dwoma odniesieniami do var: ref i r_ref.

Należy pamiętać, że odwołanie jest tylko alias: po to jest zobowiązany do obiektu (i musi być związany z jakimś przedmiotem w czasie inicjalizacji, i nie może być ponownie związany później), wszystko, co robisz na podstawie odwołania, jest wykonywane na obiekcie, do którego się odwołuje, tak jakby referencja była po prostu alternatywną nazwą.

Co oznacza stwierdzenie:

nie można odwołać innego odniesienia

jest, że nie można traktować odniesienie sama jako podmiotu, który może być dalej aliasem: Referencje są aliasami dla obiektów i cokolwiek robisz na referencji (w tym na granicy odniesienia!) jest wykonywane na odwoływanym obiekcie.

0

int var = 10; deklaruje zmienną var. Teraz po napisaniu int& ref = var; zdefiniowano odniesienie do var. Możesz spojrzeć na ref jako tylko alias dla var. Gdziekolwiek używasz ref, to tak jakbyś bezpośrednio używał var.

Jest to powód, dla którego int& r_ref = ref; definiuje tylko inne odniesienie do var.

Powiązane problemy