<MyRusakov.ru />

Профессия Web-разработчик

Профессия Web-разработчик

Этот комплект за 8 месяцев превратит Вас в Web-разработчика с нуля. Учиться достаточно 1 час в день.

Начнёте Вы с HTML, CSS и вёрстки сайтов. Потом перейдёте к программированию и JavaScript. Затем изучите PHP, MySQL, SQL, Python. Изучите Web-фреймворки Laravel и Django. Создадите 5 своих сайтов для портфолио.

Комплект содержит:

- 540 видеоуроков

- 110 часов видео

- 1205 заданий для закрепления материала из уроков

- 5 финальных тестов

- 7 сертификатов

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Передача параметров в функции C++: по значению, ссылке и const-ссылке

Передача параметров в функции C++: по значению, ссылке и const-ссылке

Один из частых поисковых запросов новичков — как передавать параметры в функцию C++. На первый взгляд всё просто: написал функцию, передал переменную, получил результат. Но от способа передачи зависит производительность, безопасность кода и даже наличие скрытых ошибок. В этой статье разберём три базовых варианта: по значению, по ссылке и по const-ссылке.

1. Передача по значению

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

#include <iostream>

void addTen(int x) {
    x += 10;
    std::cout << "Внутри функции: " << x << '\n';
}

int main() {
    int number = 5;

    addTen(number);

    std::cout << "После вызова: " << number << '\n';
}

Результат:

Внутри функции: 15
После вызова: 5

Переменная number не изменилась, потому что функция работала с копией.

Когда использовать передачу по значению

  • Для маленьких типов: int, double, char, bool.
  • Когда функция не должна менять исходное значение.
  • Когда копирование дешёвое и не влияет на производительность.

Для простых чисел передача по значению обычно является лучшим и самым понятным вариантом.

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

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

#include <iostream>

void addTen(int& x) {
    x += 10;
}

int main() {
    int number = 5;

    addTen(number);

    std::cout << number << '\n'; // 15
}

Здесь int& x означает: параметр x — это ссылка на исходную переменную. Поэтому изменение x меняет number.

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

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

Пример обмена значений:

#include <iostream>

void swapValues(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int x = 10;
    int y = 20;

    swapValues(x, y);

    std::cout << x << ' ' << y << '\n'; // 20 10
}

В реальном C++ для обмена обычно используют std::swap, но такой пример хорошо показывает смысл ссылок.

3. Передача по const-ссылке

const-ссылка — один из самых полезных приёмов в C++. Она позволяет не копировать объект, но при этом запрещает изменять его внутри функции.

#include <iostream>
#include <string>

void printName(const std::string& name) {
    std::cout << "Имя: " << name << '\n';

    // name += "!"; // Ошибка: менять const-параметр нельзя
}

int main() {
    std::string userName = "Анна";
    printName(userName);
}

Если бы мы написали void printName(std::string name), строка копировалась бы при каждом вызове. Для маленькой строки это незаметно, но для больших объектов или частых вызовов лишнее копирование может стать проблемой.

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

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

Например, так удобно выводить данные о пользователе:

#include <iostream>
#include <string>

struct User {
    std::string name;
    int age;
};

void printUser(const User& user) {
    std::cout << user.name << ", " << user.age << " лет\n";
}

int main() {
    User user{"Иван", 25};
    printUser(user);
}

Сравнение способов передачи параметров

СпособКопированиеМожно изменить оригиналКогда применять
По значениюДаНетМаленькие типы, независимая копия
По ссылкеНетДаНужно изменить объект
По const-ссылкеНетНетБольшие объекты только для чтения

Типичная ошибка новичков

Новички часто передают большие объекты по значению, хотя функция только читает данные:

void printItems(std::vector<std::string> items) {
    // items копируется целиком — это может быть дорого
}

Лучше так:

void printItems(const std::vector<std::string>& items) {
    // копирования нет, изменить items нельзя
}

Для этого примера нужен заголовок <vector>, но суть проста: если контейнер не меняется, передавайте его по const&.

Практические рекомендации

  • int, double, bool, char обычно передавайте по значению.
  • std::string, std::vector, std::map и свои классы чаще передавайте по const&, если функция только читает.
  • Используйте обычную ссылку &, только если функция действительно должна изменить аргумент.
  • Не делайте параметры изменяемыми «на всякий случай» — это ухудшает читаемость и повышает риск ошибок.
  • Если функция возвращает один результат, чаще лучше использовать return, а не изменяемый параметр.

Мини-практика

Попробуйте определить, какой способ передачи подходит для каждой функции:

double square(double x);                 // по значению
void normalize(std::string& text);       // по ссылке, если меняем строку
void printReport(const Report& report);  // по const-ссылке, если только читаем

Если вы хотите не просто выучить отдельные правила, а собрать цельную картину языка — функции, ссылки, классы, память, STL и практические задачи — посмотрите курс «Программирование на C++ с Нуля до Гуру». Он хорошо подходит тем, кто хочет уверенно перейти от основ к реальной разработке на C++.

Вывод

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.