2013-07-27 2 views
1

Я читал о ссылочных переменных C++ и где-то я нашел это:Что означает «ссылка никогда не может ссылаться на другой объект»?

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

Что это значит?

Вот, например, я могу изменить объект, ссылка на который указывает ссылка:

void p(int& i) { 
    int a = 7,c = 0; 
    i = a; 
} 

Так что же это означает, что «Ссылка никогда не может быть сделано, чтобы обратиться к другому объекту»?

благодарит заранее.

+0

также http://stackoverflow.com/questions/728233/why-are-references-not-reseatable-in-c – billz

+0

Лучший способ взглянуть на ссылки - это другое имя, на которое они ссылаются: ' int i; int & r = i; 'Здесь' r' - другое имя для 'i'. Крайне важно понять, что 'r' does * not * указывает на' i'. 'r' * is *' i'. И это не может быть ничего, кроме 'i'. Вот почему в тексте говорится: «никогда нельзя ссылаться на другой объект». –

ответ

3

Это означает, учитывая этот код

int a; 
int b; 
int& ref = a; 

, что, как только вы инициализируется ref обратиться к a, нет никакого способа, вы можете сделать это, обратитесь к b или любой другой переменной.

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

Также ссылка может использоваться только до тех пор, пока объект, на который он ссылается, остается живым.

+0

Отлично! Спасибо ! – Billie

1

В вашем примере вы не меняете то, что указывает i. Он меняет значение VALUE i на значение a. Если вы укажете адрес i, вы увидите, что он отличается от a.

0

Если вы int &r = x; это означает, что r относится к x и каждый раз, когда вы изменяете r, вы на самом деле изменить x. Аналогично каждый раз, когда вы меняете x, это изменение видно через r.

что теперь «Ссылка никогда не может быть сделано, чтобы обратиться к другому объекту» означает, что как только вы делаете int &r =x, вы не можете сделать r см y. Вы можете сделать r = y;, но все, что делает, это установить x, равный y. Это не означает, что изменение r впоследствии изменится y, или это не означает, что изменения в y будут видны через r.

0

Самый простой способ представить себе это, чтобы говорить в терминах указателей:

// reference      // equivalent pointer code 
int& r = a;      int* const r = &a; 

r = b;       *r = b; 

function(r);      function(*r); 

То есть, на момент объявления, ссылка объявляет псевдоним ячейки памяти существующего объекта. Тогда любое использование ссылки эквивалентно разыменованию указателя на эту ячейку памяти.

Теперь, что из const ссылка?Хорошо было бы:

// reference      // equivalent pointer code 
int& const r = a;    int* const const r = &a; 

int const& const r = a;   int const* const const r = &a; 

, что делает избыточность вполне очевидной, я считаю.