3.5. Ссылки - StriderAJR/StudentCpp GitHub Wiki
#pragma once
#include <iostream>
using namespace std;
namespace References
{
int main()
{
int a = 5;
int& ref_a = a; // Это и есть переменная типа ссылка
int& ref_test; // Тут при компиляции будет ошибка
cout << "a = " << a << endl; // Выведет 5
cout << "ref_a = " << ref_a << endl; // Тоже выведет 5
a++; // Увеличили значение ячейки на 1
cout << "ref_a = " << ref_a << endl; // Выведется 6!
// Потому что ref_a - это та же ячейка, которую мы только что увеличили на 1
ref_a++; // Увеличили значение все той же ячейки на 1
cout << "a = " << a << endl; // Выведется 7!
int b = ref_a;
cout << "b = " << b << endl;
b++;
cout << "b = " << b << endl;
cout << "a = " << a << endl;
return 1;
}
}
Ссылка - это альтернативное имя переменной
Во многих учебниках ссылку называют константным указателем или неявный указателем, подразумевая таким образом то, как ссылка реализуется на низком уровне компилятором С++. Ссылка действительно реализуется "под капотом" через указатель, который будет разменовываться самостоятельно без вашего участия.Но дело в том, что для нас, программистом, тех, кто использует ссылочный тип данных в своем коде, ссылка ни по поведению, ни по смыслу НИЧЕМ НЕ ПОХОЖА НА УКАЗАТЕЛЬ! Это все равно, что называть автомобиль пылесосом, потому оба делают забор воздуха из окружающей среды.Воспринимайте и характеризуйте ссылку именно как альтернативное имя ячейки памяти. Это как дополнительный ярлычок, с помощью которого вы можете обратиться к ячейке. Не связывайте в своей голове указатель и ссылку. Между ними нет ничего общего в плане применения. Теперь подробнее про ссылки. Допустим, мы создали в памяти ячейку с именем а и типом данных int, записали туда, какое-то значние.
int a = 5;
Теперь в памяти есть ячейка с именем a и значением 5
Теперь создадим ссылку на эту переменную
int& ref_a = a; // Это и есть переменная типа ссылка
int& - тип данных "ссылка".
int - тип данных переменной, на которую мы создали ссылку.
& - синтаксический символ обозначающий ссылку.
ref_a** - имя переменной типа ссылка.
Теперь в памяти есть ячейка с именем a и значением 5.
Обратите внимание, что в памяти не вывелилось новых ячеек памяти. Ячейка так и осталась одна, но у нее появилось второе имя, с помощью которого к ней можно обращаться. Это и есть ссылка. Альтернативное имя переменной.
При создании ссылки ее нужно обязательно сразу же проициализировать. Ссылка не может висеть в воздухе! Ей сразу нужно сказать альтернативное имя чего она является.
int& ref_test; // Тут при компиляции будет ошибка
Теперь у нас в памяти есть 1 ячейка, которая хранит значение 5 и 2 имени для этой ячейки: a и ref_a
1. Ссылка должна быть проинициализирована сразу же во время объявления
2. Ссылка не может быть неопределенной или иметь значение NULL
3. Инициализированная однажды, ссылка не может изменить ячейку, к которой привязана