Ссылка (reference) - это переменная определённого типа, которая по сути предоставляет доступ к указанной переменной по новому имени, делает её "зеркальную копию":
- Синтаксис создания ссылки:
тип данных& имя = переменная;
. Так как в C/C++ не учитываются отступы, запись может иметь видтип данных & имя
,тип данных &имя
итип данных&имя
- это всё одно и то же - Ссылка должна быть инициализирована переменной такого же типа
- Ссылка не может быть изменена в процессе работы, так как меняться будут данные по ней
//int& ref; // ошибка - ссылка не инициализирована
int a = 0;
int& a_ref = a; // ссылка на a
a_ref = 123; // запись в переменную a по ссылке
// здесь a равна 123
a_ref = a; // здесь a присваивается к a, код не имеет смысла
// здесь a равна 123
int b = 456;
a_ref = b; // здесь b присваивается к a - сама ссылка не меняется
// здесь a равна 456
int a_copy = a; // новая переменная со значением, равным a
// a_copy a равна 456
a_copy = 789; // здесь меняется переменная a_copy
// здесь a равна 456
// a_copy равна 789
Несколько ссылок #
Чтобы создать несколько ссылок в одну строку, нужно указывать символ &
перед каждой ссылкой:
int a;
int &ref0 = a, &ref1 = a, &ref2 = a;
Const ссылка #
Ссылка может быть const
- данные по такой ссылке нельзя менять, можно только читать:
int a = 123;
const int& a_ref = a;
//a_ref = 456; // ошибка компиляции
Ссылка на константу #
Можно создать ссылку на константу - в этом случае ссылка и сама должна быть const
:
const int a = 10;
const int& a_cref = a;
//int& a_ref = 123; // ошибка компиляции, ссылка не на константу
Более того, так как числа в программе являются константами своего типа, можно создать константную ссылку на число. Это не имеет смысла, но компилируется и работает:
const int& ref = 123;
В некоторых случаях это позволяет писать более гибкий код, рассмотрим в следующих уроках.
Вес ссылки #
Ссылка по сути хранит в себе адрес переменной, поэтому сама имеет фиксированный размер адреса на текущей платформе 2/4/8 байт (AVR 2 байта, ESP 4 байта).
Зачем нужны ссылки? #
Переменную можно передать по ссылке в другое место программы, сохранив связь с этой переменной. Также в отличие от переменных, ссылки на любой тип данных занимают в памяти один и тот же размер, равный размеру адреса на конкретной платформе. Например для МК AVR это 2 байта, для ESP8266/ESP32 - 4 байта. Мы можем создать свой тип данных, который будет занимать в памяти много места, но ссылка на него будет такой же лёгкой. Это очень пригодится в случае, когда данные нужно передать в другую часть программы - ссылка займёт меньше места, лишняя память под данные не выделится и программа будет работать быстрее. Конкретные примеры будут разобраны в следующих уроках.