Переменная four
является объектом, а не ссылкой.
Когда вы присваиваете ему ссылку, four=GetRef(one);
, four
не превращается в ссылку.Присвоение копирует все, на что ссылается ссылка (в данном случае это ссылка one
).После этого объекты не связаны.Таким образом, four = GetRef(one);
имеет тот же эффект, что и four = one;
.
myStruct &five = one;
, с другой стороны, объявляет five
как ссылку (не объект) и «связывает» объект one
к ссылке.Таким образом, имя five
и имя one
относятся к одному и тому же объекту. Это означает, что, конечно, изменения, сделанные с использованием любого имени, можно увидеть с использованием другого имени.
Кстати, в этом нет необходимости [*] для typedef struct myStruct myStruct;
в C ++.В C ++ к типу класса можно обращаться по имени, а структуры являются классами.
[*], за исключением несколько странного углового случая, когда у вас есть функция с тем же именемкак класс, параметры которого совместимы с параметрами некоторого конструктора этого класса.Тогда вы можете подумать, что выражение Foo(x,y)
будет неоднозначным между функцией Foo
и вызовом конструктора Foo
.Но нет - в отсутствие typedef, C, конечно, выбирает функцию, и поэтому для совместимости с C, C ++ делает то же самое.Большинство людей не находят этот случай достаточно убедительным, чтобы написать typedefs на C ++.