0Pricing
C++ Academy · Урок

Передача по значению и по ссылке

Сравнивайте семантические различия и различия в производительности при передаче по значению и по ссылке.

«Передача по значению и по ссылке» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Итоги передачи по значению

При передаче аргумента по значению функция получает копию. Изменения внутри функции не влияют на вызывающий код.

void increment(int x) {
    x++;          // modifies the copy
}

int n = 5;
increment(n);
std::cout << n;   // still 5

Передача по ссылке

Передавайте по ссылке, используя & в списке параметров. Функция работает непосредственно с переменной вызывающего кода.

void increment(int& x) {
    x++;
}

int n = 5;
increment(n);
std::cout << n;   // now 6

Зачем передавать по ссылке

Две причины:

  • Избегать копирования больших объектов (производительность)
  • Изменять переменную вызывающего кода (семантика)

Константная ссылка: лучшее из двух вариантов

Константная ссылка позволяет избежать копирования, не давая функции права изменять объект. Используйте её для нетривиальных входных параметров.

void printName(const std::string& name) {
    std::cout << name;
}

Практические правила

Для параметров функций:

  • Дёшево копируются (int, число двойной точности, pointer) → передавайте по значению
  • Дорого копируются и используются только для чтения → const T&
  • Функция изменяет данные вызывающего кода → T&

Передача по указателю

Указатели также позволяют изменять переменную вызывающего кода, но вызывающий код должен явно получить её адрес с помощью &, поэтому намерение становится очевидным.

void increment(int* x) {
    (*x)++;
}

int n = 5;
increment(&n);

Параметр-ссылка и параметр-указатель

Ссылки удобнее, когда значение обязательно. Указатели подходят, когда аргумент необязателен: передайте nullptr, чтобы его пропустить.

Возврат по значению

Возврат по значению используется по умолчанию. Благодаря RVO (оптимизации возвращаемого значения) и семантике перемещения он обычно не медленнее возврата по ссылке и при этом безопаснее.

Возврат по ссылке

Возвращайте ссылку, когда функция возвращает существующий объект, который продолжает существовать после вызова (например, член контейнера). Никогда не возвращайте ссылку на локальную переменную.

Смешивание способов передачи в шаблонах

В шаблонах часто используются универсальные ссылки (T&&) и std::forward, чтобы сохранять категории значений. Это рассматривается в курсе «Семантика перемещения».

Распространённая ошибка: усечение

Передавайте объекты производных классов по ссылке (или указателю) в параметр базового типа. Передача по значению отбрасывает производную часть объекта.

class Base { /* virtual */ };
class Derived : public Base { /* members */ };

void takeByValue(Base b);    // SLICES Derived!
void takeByRef(Base& b);     // OK

Быстрая проверка

Как следует передавать большую строку std::string, которую функция только читает?

Итоги

Передача по значению создаёт копию, а передача по ссылке совместно использует объект. Используйте const T& для больших объектов, предназначенных только для чтения, T& — когда нужно изменить данные вызывающего кода, а небольшие встроенные типы передавайте по значению.

Часто задаваемые вопросы

Урок «Передача по значению и по ссылке» бесплатный?

Да — полный текст урока «Передача по значению и по ссылке» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Передача по значению и по ссылке»?

Сравнивайте семантические различия и различия в производительности при передаче по значению и по ссылке. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Передача по значению и по ссылке»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Зачем нужны ссылки — псевдонимы переменных
  2. Передача по значению и по ссылке
  3. Ссылки const и когда их использовать
  4. Время жизни ссылок и висячие ссылки
← Назад к C++ Academy