За замовчуванням, аргументи в мові C++ передаються по значенню. Коли аргумент передається по значенню, то його значення копіюється в параметр функції. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> void boo(int y) { std::cout << "y = " << y << std::endl; } int main() { boo(7); // 1-й виклик int x = 8; boo(x); // 2-й виклик boo(x + 2); // 3-й виклик return 0; } |
У першому виклику функції boo() аргументом є літерал 7. При виклику boo() створюється змінна y, в яку копіюється значення 7. Потім, коли boo() завершує своє виконання, змінна y знищується.
У другому виклику функції boo() аргументом вже є змінна x = 8. Коли boo() викликається вдруге, змінна y створюється знову і значення 8 копіюється в y. Потім, коли boo() завершує своє виконання, змінна y знову знищується.
У третьому виклику функції boo() аргументом є вираз x + 2, який обчислюється в значення 10. Потім це значення передається в змінну y. При завершенні виконання функції boo() змінна y знову знищується.
Таким чином, результат виконання програми:
y = 7
y = 8
y = 10
Оскільки в функцію передається копія аргументу, то початкове значення не може бути змінено функцією. Це добре проілюстровано в наступному прикладі:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> void boo(int y) { std::cout << "y = " << y << '\n'; y = 8; std::cout << "y = " << y << '\n'; } // змінна y знищується тут int main() { int x = 7; std::cout << "x = " << x << '\n'; boo(x); std::cout << "x = " << x << '\n'; return 0; } |
Результат:
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), структурами, класами або перерахуваннями (тобто майже будь-чим).
Аргументи ніколи не змінюються функцією, в яку передаються, що запобігає виникненню побічних ефектів.
Мінуси передачі по значенню:
Копіювання структур і класів може призвести до значного зниження продуктивності (особливо, коли функція викликається багато разів).
Коли використовувати передачу по значенню:
При передачі фундаментальних типів даних і енумераторів, коли припускається, що функція не повинна змінювати аргумент.
Коли не використовувати передачу по значенню:
При передачі масивів, структур і класів.
У більшості випадків, передача по значенню — це найкращий спосіб передачі аргументів фундаментальних типів даних, коли функція не повинна змінювати вихідні значення. Передача по значенню є гнучкою і безпечною, а у випадку фундаментальних типів даних ще й ефективною.

(66 оцінок, середня: 4,91 з 5)