Урок №97. Передача по значению

  Юрий  | 

  Обновл. 29 мая 2019  | 

 11088

 ǀ   6 

По умолчанию аргументы в C++ передаются по значению. Когда аргумент передаётся по значению, то его значение копируется в параметр функции. Например:

В первом вызове функции boo() аргументом является литерал 7. При вызове boo() создаётся переменная y, а значение 7 копируется в y. Затем, когда boo() завершает своё выполнение, переменная y уничтожается.

Во втором вызове функции boo() аргументом является уже переменная x = 8. Когда boo() вызывается во второй раз, переменная y создаётся снова и значение 8 копируется в y. Затем, когда boo() завершает своё выполнение, переменная y снова уничтожается.

В третьем вызове функции boo() аргументом является выражение x + 2, которое вычисляется в значение 10. Затем это значение передаётся в переменную y. Переменная y уничтожается опять при завершении выполнения функции boo().

Таким образом, результат выполнения программы выше:

y = 7
y = 8
y = 10

Поскольку копия аргумента передаётся в функцию, то исходное значение не может быть изменено функцией. Это хорошо проиллюстрировано в следующем примере:

Результат:

x = 7
y = 7
y = 8
x = 7

В начале функции main() x равно 7. При вызове boo() значение x (7) передаётся в параметр y функции boo(). Внутри boo() переменной y сначала присваивается значение 8, а затем у уничтожается. Значение x не изменяется, даже если изменить y.

Параметры функции, переданные по значению, также могут быть const. Тогда уже будет 100% гарантия того, что функция не изменит значение параметра.

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

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

   Аргументы, переданные по значению, могут быть переменными (например, x), литералами (например, 8), выражениями (например, x + 2), структурами, классами или перечислителями. Т.е. почти всем.

   Аргументы никогда не изменяются функцией, в которую передаются, что предотвращает возникновение побочных эффектов.

Минусы передачи по значению:

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

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

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

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

   При передаче массивов, структур и классов.

В большинстве случаев передача по значению — это наилучший способ передачи аргументов фундаментальных типов данных, когда функция не должна изменять исходные значения. Передача по значению является гибкой и безопасной, а в случае фундаментальных типов данных ещё и эффективной.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (88 оценок, среднее: 4,94 из 5)
Загрузка...

Комментариев: 6

  1. Аватар Алексей:

    Что-то я понял.

    Мы же уже якобы использовали std, зачем его снова писать.

    Уже должно быть, хотя и однократно предупреждали — это яма ошибок.

  2. Аватар Александр:

    В минусы передачи по значению обязательно нужно добавить передачу структур, которые содержат динамические параметры (при условии, что мы не уверены, насколько качественно эта структура прописана). Так как это может приводить к абсолютно непредсказуемым результатам.

  3. Аватар Роман:

    Спасибо вам за уроки, всё понятно, мне всего 14 а я уже на пол пути в изучении С++, одна мне не понятные перечисления и классы, я не до конца понял как ими пользоваться, а главное зачем, почти все тесты и задания я писал без них.

  4. Аватар Михаил:

    Дорогой личик, я уже дошел до сюда, я так и не понял что такое передача аргументов, напиши пожалуйста фрагмент кода где он отображен !

    1. Юрий Юрий:

      В boo(7) — число 7 является аргументом, который передается в параметр функции boo() по значению.

      1. Аватар Михаил:

        Более, менее стало понятно, Благодарю

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *

telegram канал
НОВОСТИ RAVESLI