Посмотр рубрик

Ссылки

Ссылка (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 блоков кода

Полезные страницы #


(11 голосов)
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Прокрутить вверх