Ссылка (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 равна 456
a_copy = 789; // здесь меняется переменная a_copy
// здесь a равна 456
// a_copy равна 789
Несколько ссылок #
Чтобы создать несколько ссылок в одну строку, нужно указывать символ & перед каждой ссылкой:
int a;
int &ref0 = a, &ref1 = a, &ref2 = a;
Ссылка на ссылку #
Это полностью корректно, можно считать что ссылка - это просто та же самая переменная и ведёт себя соответствующе:
int a;
int& aRef = a;
int& aRef2 = aRef;
aRef2 = 123; // изменили 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 = a; // ошибка компиляции - неконстантная ссылка
Более того, так как числа в программе являются константами своего типа, можно создать константную ссылку на число. Это не имеет смысла, но компилируется и работает:
const int& ref = 123;
Вес ссылки #
Стандарт не требует, чтобы ссылка физически хранила адрес или вообще занимала отдельную память - компилятор выбирает реализацию сам. Оператор sizeof(ref) возвращает размер объекта, на который ссылается ref, а не "размер ссылки".
Зачем нужны ссылки? #
Переменную можно передать по ссылке в другое место программы, сохранив связь с этой переменной. Сам объект при этом не копируется. Это особенно пригодится, когда крупные данные нужно передать, например, в функцию: лишняя память под копию не выделится. Конкретные примеры будут разобраны в следующих уроках.
Дополнительно #
Дополнительный контент доступен владельцам набора GyverKIT и по подписке, подробнее читай здесь. Блок содержит:
- Тезисы, Вопросы и задания, Примеры (Arduino)
- 1 блоков кода
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту (alex@alexgyver.ru)
- Поддержать автора за работу над уроками