Ссылки const и когда их использовать
Передавайте большие объекты эффективно и безопасно с помощью ссылок const.
«Ссылки const и когда их использовать» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что гарантирует константная ссылка
const T& означает: «Я не буду изменять объект, на который ссылаюсь». Компилятор это обеспечивает.
void print(const std::string& s) {
// s.clear(); // ERROR: s is const
std::cout << s;
}Почему бы просто не передавать по значению
Копирование больших объектов расточительно. Константная ссылка практически бесплатна (внутри это всего лишь указатель) и никогда не позволяет функции изменить данные вызывающего кода.
Связывание с любым объектом
Константная ссылка может связываться с объектами, имеющими имя, с временными значениями и с временными объектами, что делает её самым универсальным типом параметра для доступа только для чтения.
void f(const std::string& s);
std::string a = "hi";
f(a); // lvalue
f("hello"); // temporary string
f(std::move(a)); // rvalueПродление времени жизни
Связывание временного объекта с константной ссылкой продлевает время его жизни до времени жизни ссылки. Это полезно при создании объектов непосредственно в выражении.
const std::string& greeting = "Hello, " + name;
// the concatenated string lives as long as `greeting`Когда NOT следует использовать константную ссылку
Для типов, которые тривиально копируются (int, числа двойной точности, pointer), используйте передачу по значению. Ссылка добавляет косвенную адресацию и ничего не даёт взамен.
Константная ссылка в цикле for по диапазону
Канонический цикл только для чтения. Он предотвращает и копирование, и случайное изменение данных.
for (const auto& x : container) {
process(x);
}Возврат константной ссылки
Возвращайте константную ссылку, когда результатом является существующий объект, который вызывающий код не должен изменять (элемент или кэшированное значение).
class Person {
std::string name_;
public:
const std::string& name() const { return name_; }
};Корректное использование const
Помечайте как const каждый параметр и каждую функцию-член, которые не изменяют состояние. Компилятор обнаружит случайные записи — это мощный уровень защиты.
Константные функции-члены
Функция-член, после списка параметров помеченная как const, не может изменять объект. Такие функции вызываются для константных экземпляров.
class Counter {
int n_ = 0;
public:
int value() const { return n_; } // pure reader
void increment() { n_++; }
};Проблема: const_cast снимает константность
С помощью const_cast можно убрать константность, но применение этого к изначально константному объекту приводит к неопределённому поведению. Используйте это только при взаимодействии с устаревшими API, не использующими const.
mutable для внутреннего состояния
Ключевое слово mutable позволяет константной функции-члену изменять определённые члены — это полезно для кэширования или мьютексов.
class Cache {
mutable std::mutex mtx_;
mutable std::optional<int> cached_;
public:
int value() const {
std::lock_guard<std::mutex> lk(mtx_);
// ...
}
};Быстрая проверка
Почему для параметра обычно лучше написать const std::string&, чем std::string?
Итоги
Используйте const T& для параметров, предназначенных только для чтения, возвращаемых значений функций доступа и циклов по диапазону. Для нетривиальных типов это быстрее передачи по значению и безопаснее неконстантных ссылок.
Часто задаваемые вопросы
Урок «Ссылки const и когда их использовать» бесплатный?
Да — полный текст урока «Ссылки const и когда их использовать» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ссылки const и когда их использовать»?
Передавайте большие объекты эффективно и безопасно с помощью ссылок const. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Ссылки const и когда их использовать»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны ссылки — псевдонимы переменных
- Передача по значению и по ссылке
- Ссылки const и когда их использовать
- Время жизни ссылок и висячие ссылки