Ссылки в 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Это синтаксическая ошибка
Поддержать проект