Ссылки в C++
Что такое ссылка
Ссылка — другое имя уже существующего объекта. Обычная lvalue-ссылка объявляется с &:
int value = 10;int& alias = value;alias = 25;std::cout << value << '\n'; // 25После инициализации ссылка не может быть перенаправлена на другой объект. Присваивание через ссылку меняет сам объект.
Ссылка должна быть инициализирована
int value = 5;int& ref = value;Нельзя объявить обычную ссылку без инициализации. В отличие от указателя, ссылка в корректном коде предназначена для обозначения существующего объекта.
Константная ссылка
const T& позволяет читать объект, не копируя его и не изменяя через эту ссылку:
void Show(const std::string& text) { std::cout << text << '\n';}Константная ссылка может связываться с временным объектом, продлевая его время жизни в некоторых контекстах, например при локальном объявлении const std::string& ref = MakeString();. Однако возвращать ссылку на локальный объект из функции нельзя.
Ссылки и указатели
| Ссылка | Указатель |
|---|---|
| Инициализируется при объявлении | Может быть nullptr |
| Не перенаправляется | Можно изменить адрес |
Обращение без * | Разыменование через * |
Возврат ссылки
Возвращать ссылку можно, если исходный объект продолжит существовать:
int& At(std::array<int, 3>& values, std::size_t index) { return values.at(index);}В реальном коде стоит учитывать, что at() может выбросить исключение, а ссылка действительна только пока жив сам контейнер и не произошло недопустимое изменение его состояния.
Итог
Ссылки удобны для параметров и доступа к существующим объектам. Главное правило безопасности — никогда не оставлять ссылку на объект, время жизни которого уже завершилось.
