Когда использовать указатели, а когда ссылки
Выбирайте между указателями и ссылками с учётом возможности отсутствия объекта и семантики владения.
«Когда использовать указатели, а когда ссылки» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Разные инструменты для разных задач
И ссылки, и указатели позволяют косвенно обращаться к другому объекту, но имеют разную семантику. Используйте каждый инструмент там, где он наиболее полезен.
Ссылки для обязательных объектов
Ссылка не может быть нулевой и не может быть переназначена. Используйте параметр-ссылку, если функции всегда нужен настоящий объект.
void render(const Image& img); // must have an imageУказатели для необязательных объектов
Указатель может быть нулевым. Используйте указатель, если аргумент действительно является необязательным.
void render(const Image* img); // nullptr means "skip"Указатели для переназначения
Указатели можно перенаправлять на разные объекты. Используйте их, когда косвенное обращение меняется в ходе алгоритма, например для перемещаемого курсора или текущего узла.
Node* current = head;
while (current) {
process(current);
current = current->next;
}Ссылки для контейнеров ссылок
Нельзя создать std::vector<T&>. Используйте std::vector<std::reference_wrapper<T>> или храните указатели.
Возврат ссылок
Возвращайте ссылку, если результат существует дольше вызова и вызывающая сторона может использовать его напрямую, например для членов объекта или элементов контейнера.
std::string& Person::name() { return name_; }Возврат указателей
Возвращайте указатель, если функция может вернуть «отсутствие результата» или если владение не определено. В современном коде предпочитайте std::optional или умные указатели.
Члены класса
Хранение ссылки в качестве члена фиксирует объект, на который она ссылается, на всё время существования объекта и запрещает присваивание при копировании. Указатели-члены более гибки, но требуют проверок на нулевое значение.
Полиморфизм
И указатели, и ссылки можно использовать для полиморфизма. Храните указатели на базовый класс в контейнерах (вектор не может содержать ссылки), а для параметров используйте ссылки, когда нулевое значение недопустимо.
Умные указатели лучше обычных указателей-владельцев
Используйте обычные указатели только для не владеющего косвенного обращения. Владение должно принадлежать std::unique_ptr или std::shared_ptr.
Краткая памятка по выбору
Краткое руководство:
- Объект всегда действителен → ссылка
- Объект может отсутствовать → указатель или
std::optional - Косвенное обращение перемещается → указатель
- Владение памятью → умный указатель
- Объект хранится в контейнере → указатель (векторы ссылок неудобны)
Быстрая проверка
Какой тип параметра лучше всего подходит для функции, которой требуется ненулевой объект?
Повторение
Используйте ссылки для обязательных неизменяемых объектов, а указатели — для необязательных или перемещаемых объектов. Для владения предпочитайте умные указатели. Контейнерам обычно нужны указатели, а не ссылки.
Часто задаваемые вопросы
Урок «Когда использовать указатели, а когда ссылки» бесплатный?
Да — полный текст урока «Когда использовать указатели, а когда ссылки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Когда использовать указатели, а когда ссылки»?
Выбирайте между указателями и ссылками с учётом возможности отсутствия объекта и семантики владения. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Когда использовать указатели, а когда ссылки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обычные указатели и оператор взятия адреса
- Разыменование и арифметика указателей
- nullptr и безопасность нулевых указателей
- Когда использовать указатели, а когда ссылки