понимание ссылок в с ++ - PullRequest
       19

понимание ссылок в с ++

2 голосов
/ 25 февраля 2020

У меня есть следующий код:

int main() {
    int x = 3;
    int &ref = x;
    int &ref2 = ref;
    ref = 100;
    std::cout <<ref;
    std::cout <<ref2;
    return 0;
}

Эта распечатка 100 и 100. Я нахожу это запутанным. Насколько я понимаю, ref и ref2 являются ссылками на базовый объект (x=3). Затем мы изменим значение ref. Таким образом, я ожидал 100 и 3.

Ответы [ 2 ]

6 голосов
/ 25 февраля 2020

Вы никогда не измените значение из ref (язык не позволяет перепривязать ссылку). Фактически, именно поэтому вам нужно использовать инициализацию ссылки при создании ссылки: например, вы не можете написать int &ref; ref = x;.

Оператор ref = 100; изменяет значение объект, к которому привязана ссылка.

Следовательно, выходные данные x, ref и ref2 идентичны.

5 голосов
/ 25 февраля 2020

Насколько я понимаю, и ref, и ref2 являются ссылками на базовый объект (x = 3)

Да.

Что ж, они обе ссылаются на x, чье начальное значение равно 3. По сути, у вас есть один целочисленный объект, к которому вы можете обращаться по именам, любым из имен x, ref или ref2.

Затем мы меняем значение ref

Нет, вы противоречите себе.

У объектов есть значения. Ссылки типа ref не являются объектами, но являются ссылками на объекты, и у них нет собственного значения, которое можно изменить.

Вы сказали, что ref является ссылкой, что верно - это ссылка на объект типа int, который может принимать значение, и значение которого изменяется, когда вы пишете ref = 100. Имена x, ref и ref2 все еще относятся к одному и тому же целочисленному объекту впоследствии, но теперь его значение равно 100 вместо 3.

Вы не можете reseat ссылка (сделайте так, чтобы она ссылалась на другой объект), и ссылка не имеет значения для изменения. Он относится к объекту, значение которого можно изменить с помощью ссылки.


Примечание. Я не думаю, что этот вопрос является дубликатом Можем ли мы переназначить ссылку , даже если она содержит некоторые из тех же недоразумений.

...