C ++ уточнение ссылочной переменной - PullRequest
1 голос
/ 07 июня 2010

Я думаю, что большинство снова удивится этой теме, однако я имею в виду книгу «Общие знания C ++: основное промежуточное программирование», написанную «Stephen C. Dewhurst».

В книге он цитирует конкретное предложение (в разделе под пунктом 5. Ссылки - псевдонимы, а не указатели), как показано ниже

Ссылка - это псевдоним для объекта, который уже существует до инициализации ссылки. Как только ссылка инициализируется для ссылки на конкретный объект, она не может быть позже сделана для ссылки на другой объект ; ссылка связана с инициализатором в течение всего времени жизни

Кто-нибудь может объяснить, пожалуйста, контекст "позже нельзя заставить ссылаться на другой объект"

У меня работает код ниже,

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
 int i = 100;
 int& ref = i;
 cout<<ref<<endl;

 int k = 2000;
 ref = k;
 cout<<ref<<endl;

 return 0;
}

Здесь я ссылаюсь на переменную ref на переменную i и j. И код прекрасно работает.

Я что-то упустил? Я использовал SUSE10 64bit linux для тестирования моей программы.

Спасибо за ваш вклад заранее.

Ответы [ 3 ]

11 голосов
/ 07 июня 2010

Вы не привязываете ref к другому объекту: когда вы делаете ref = k, это как если бы вы сделали i = k, который просто переназначил значение i. Другими словами, вы звоните i operator=.

Вот кое-что, что лучше демонстрирует идею:

#include <iostream>

int main()
{
    std::ostream& stream = std::cout;
    stream = std::cerr; // fails to compile!  Cannot access ostream::operator=
    return 0;
}
5 голосов
/ 07 июня 2010

Строка ref = k не меняет то, на что ссылается ref, она присваивает значение k значению ref. Если впоследствии вы напечатаете i, то обнаружите, что i теперь тоже 2000.

2 голосов
/ 07 июня 2010
#include <iostream>

int main()
{
    int i = 100;
    int& ref = i;
    int k = 2000;
    ref = k;

    if (&ref == &i) std::cout << "ref is bound to i\n";
    if (&ref == &k) std::cout << "ref is bound to k\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...