У першому розділі туторіалу по С++ ми розглядали функції на наступних уроках:
Урок №15. Функції і оператор return
Урок №16. Параметри і аргументи функцій
Урок №22. Прототип функції і Попереднє оголошення
Урок №23. Багатофайлові програми
Перед тим як продовжити, ви повинні бути знайомі з концепціями, які ми розглядали на цих уроках.
Параметри vs. Аргументи
На наступних уроках ми детально поговоримо про параметри і аргументи, тому давайте коротко згадаємо їх визначення.
Параметр функції (або “формальний параметр”) — це змінна, яка створюється в оголошенні функції:
1 2 3 4 5 |
void boo(int x); // оголошення (прототип функції). x - це параметр void boo(int x) // визначення (також оголошення). x - це параметр { } |
Аргумент (або “фактичний параметр”) — це значення, яке в функцію передає об’єкт, який викликає (caller) функцію:
1 2 |
boo(7); // 7 - це аргумент, який передається в параметр x boo(y+1); // вираз y+1 - це аргумент, який передається в параметр x |
Коли функція викликається, всі параметри функції створюються як змінні, а значення аргументів копіюються в параметри. Наприклад:
1 2 3 4 5 |
void boo(int x, int y) { } boo(4, 5); |
При виклику функції boo() з аргументами 4
і 5
, створюються параметри x
і y
функції boo() і їм присвоюються відповідні значення: 4
і 5
. Результатом буде x = 4
і y = 5
.
Примітка: У прикладі, наведеному вище, порядок обробки параметрів в функції boo() буде справа наліво, тобто спочатку створиться змінна y
і їй присвоїться значення 5
, а потім вже створиться змінна x
і їй присвоїться значення 4
. Порядок, в якому ініціалізуються параметри в круглих дужках функції, визначає кожен компілятор окремо, так як С++ явно не вказує цей порядок обробки. З параметрами-змінними це не настільки важливо і критично, але якщо ви будете використовувати в якості параметрів виклики інших функцій (що є поганою практикою і не рекомендується до використання), то результат може бути несподіваним.
Розглянемо наступну програму:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> int prinX() { std::cout << "x = 4\n"; return 0; } int prinY() { std::cout << "y = 5\n"; return 0; } void prinAll(int a, int b) {} int main() { prinAll(prinX(), prinY()); // в якості параметрів функції використовуються виклики функцій X() і Y() return 0; } |
Результат виконання програми:
y = 5
x = 4
Хоча параметри не оголошені всередині блоку функції, вони мають локальну область видимості. Це означає, що вони створюються при виконанні функції та знищуються, коли блок функції завершується:
1 2 3 |
void boo(int x, int y) // x і y створюються тут { } // x і y знищуються тут |
Існує 3 основних способи передачі аргументів у функцію:
передача по значенню;
передача по посиланню;
передача по адресу.
Ми розглянемо кожний з цих способів по порядку.