Ссылки в C++ и отличие от указателей
Ссылки в C++ против указателей: в чём разница, когда что применять, передача по ссылке и константные ссылки.
Ссылка — это псевдоним (альтернативное имя) для уже существующей переменной. В отличие от указателя, ссылку нельзя «переключить» на другую переменную.
Объявление ссылки
#include <iostream>
int main() {
int x = 10;
int& ref = x; // ref — это x, просто другое имя
ref = 99; // то же самое, что x = 99
std::cout << x << "\n"; // 99
std::cout << (&x == &ref) << "\n"; // 1 (true) — тот же адрес
return 0;
}
Вывод:
99 1
Ссылки как параметры функций
Передача по ссылке — самый частый способ использования. Позволяет изменять исходную переменную и не копировать большие объекты.
#include <iostream>
#include <string>
void addExclamation(std::string& s) {
s += "!"; // меняем оригинал
}
int main() {
std::string msg = "Привет";
addExclamation(msg);
std::cout << msg << "\n"; // Привет!
return 0;
}
Вывод:
Привет!
const-ссылка: читаем без копирования
Для больших объектов, которые не нужно менять, используйте const T&: нет копирования, нет риска изменить.
#include <iostream>
#include <string>
void printLength(const std::string& s) {
std::cout << "Длина: " << s.length() << "\n";
// s += "x"; — ошибка компиляции: const
}
int main() {
std::string big = "Очень длинная строка";
printLength(big);
return 0;
}
Вывод:
Длина: 20
Указатель vs ссылка: когда что
Критерий | Ссылка | Указатель |
Инициализация | обязательна | можно позже |
Может быть пустым | нет | да (nullptr) |
Перенаправление | нельзя | можно |
Синтаксис | как переменная | нужен * и & |
Когда выбирать | параметры функций | динамика, nullable |
Правило: если нужно «чужое» имя без риска null — берите ссылку. Если нужна динамическая память, или значение может отсутствовать — указатель.
Коротко
- Ссылка — псевдоним переменной; создаётся один раз, не переключается.
int& ref = x— ref и x занимают одно место в памяти.const T&в параметрах — читаем без копирования и без риска изменить.- Ссылка не бывает пустой; указатель может быть
nullptr.
Проверьте себя
1. Может ли ссылка в C++ быть nullptr?
AДа, всегда
BНет, ссылка всегда привязана к объекту
CТолько константная
DВ C++17 — да
2. Для чего используют const T& в параметрах функции?
AЧтобы передать копию
BЧтобы передать без копирования и запретить изменения
CЧтобы вернуть значение
DЭто синтаксическая ошибка