2013-05-10 3 views
5

Я использую ссылочные понятия в C++, и я немного смущен этим утверждением в C++ Complete Reference.Ссылка на ссылку в C++

Вы не можете ссылаться на другую ссылку

Так что происходит в этом случае:

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

выход я получаю это:

var:11 ref:11 r_ref:11 
+3

Код, который вы написали, не ссылается на другую ссылку (например, 'int &&'). Вы дважды ссылаетесь на переменную.Итак, код в порядке. – deepmax

ответ

10

Это немного смутно сформулированное , Что они означают, так это то, что вы не можете иметь тип int& & (обратите внимание, что есть такая вещь, как int&&, но это другой тип ссылки).

В вашем коде ссылка ref относится к объекту, обозначенному var. Имена ref и var могут использоваться взаимозаменяемо, чтобы ссылаться на один и тот же объект. Поэтому, когда вы делаете int& r_ref = ref;, вы не ссылаетесь на ссылку, но вы снова ссылаетесь на тот же объект.

+0

Если ссылка на ссылку рассматривается как int & & then, то это нормально. – Daemon

+0

Еще одна вещь ** мы не можем получить адрес ссылочной переменной **. Но поскольку ref здесь относится к var, я могу печатать & ref. Так что, пожалуйста, объясните это. – Daemon

+1

@Guarav Да, когда вы делаете '& ref', вы фактически берете адрес объекта, на который он ссылается. Вы не можете взять адрес самой ссылки. На самом деле, не указано, существует ли сама ссылка даже в памяти. –

6

Так что же происходит в этом случае:

Что происходит, что вы создаете другую ссылку r_ref на объект, на который ссылается ref, который var. Таким образом, вы получаете две ссылки на var: ref и r_ref.

Имейте в виду, что речь идет всего лишь псевдоним: после того, как он привязан к объекту (и должен быть связан с какой-либо объект во время инициализации, и он не может быть повторно связаны позже), все, что вы делаете по ссылке, делается на объекте, на который ссылаются, как будто ссылка была просто альтернативным именем.

Что означает это утверждение:

Вы не можете ссылаться на другую ссылку

, что вы не можете лечить ссылки самой как сущность, которая может быть дополнительно псевдонимом: ссылки являются псевдонимами для объектов , и все, что вы делаете по ссылке (включая ссылку!), делается на объекте, на который делается ссылка.

0

int var = 10; объявляет переменную var. Теперь, когда вы пишете int& ref = var;, укажите ссылку на var. Вы можете посмотреть ref как просто псевдоним для var. Где бы вы ни использовали ref, это похоже на то, что вы используете var напрямую.

Так вот почему int& r_ref = ref; просто определяет другую ссылку на var.