0Pricing
C++ Academy · Урок

Когда использовать указатели, а когда ссылки

Выбирайте между указателями и ссылками с учётом возможности отсутствия объекта и семантики владения.

«Когда использовать указатели, а когда ссылки» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Обычные указатели и оператор взятия адреса
  2. Разыменование и арифметика указателей
  3. nullptr и безопасность нулевых указателей
  4. Когда использовать указатели, а когда ссылки
← Назад к C++ Academy