Вектор со ссылкой - PullRequest
       7

Вектор со ссылкой

1 голос
/ 04 апреля 2020

Я изучаю C ++, и у меня есть проблема, чтобы понять, почему это работает. Я понимаю, что ссылка - это просто синоним определенного объекта. Но я не понимаю, почему этот

std::vector<int> v{1,2,3};
for (auto &i : v)      //using reference
    i *= i;

выводит 1,4,9, а этот

std::vector<int> v{1,2,3};
    for (auto i : v)   //without using reference
        i *= i;

выводит 1,2,3?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

По той же причине:

int a=2;

int &b=a;

b=3;

почему это заканчивается установкой a в 3, но:

int a=2;

int b=a;

b=3;

a по-прежнему 2, и только b равно 3.

Сам вектор не имеет значения, это связано с базисной c концепцией того, что такое ссылка. Ссылка создает псевдоним для ссылочного объекта. «Без ссылки» создает новый объект. auto &i создает ссылку. auto i создает новый объект и инициализирует его, копируя его значение из другого объекта, в данном случае каждое значение в векторе.

0 голосов
/ 04 апреля 2020

Ссылка на самом деле является ссылкой на определенный объект в памяти.

Поэтому, когда вы делаете auto &i, вы создаете ссылку на объект (в этом случае это элемент из вектора). Любые операции выполняются с указанным объектом - то есть с элементом вектора. i *= i изменяет значение элемента, потому что i является ссылкой на этот элемент.

И когда вы делаете auto i, вы создаете новую переменную (объект), которая хранится в стеке. Этот объект живет только в области для l oop. Поэтому внесенные в него изменения не влияют на другие данные.

Надеюсь, это поможет.

...