Необхідно дотримуватись таких правил відносно параметрів функції:
Кожен параметр має мати власний тип_параметра. Не можна використовувати один і той же тип_параметра, щоб оголосити декілька параметрів (як при оголошенні змінних).
Якщо функція не має параметрів, в круглих дужках після імені функції нічого не міститься.
Аргумент для параметра передається копіюванням, інакше говорять “за значенням”, якщо ви не вставляєте оператор звертання за адресою ( & ) після типу параметра. Коли параметр передає копію аргументу, то функція може змінювати тільки цю копію аргументу, яку ми безпосередньо використовуємо в межах функції. Початкове ж значення аргументу залишиться незміненим. Якщо ми використовуємо оператор &, то аргумент передається “через посилання”, оголошуючи параметр посиланням на аргумент. В цьому випадку параметр стає спеціальним псевдонімом аргументу. Будь-які зміни, які функція вносить в параметр, так само вносяться і в аргумент.
Параметри-посилання отримують аргументи, які є іменами змінних. Не можна використовувати вираз чи константу як аргумент, який відповідає параметру-посиланню, так як вираз не має адреси.
Параметри-копії приймають аргументи, які є константами, змінними або виразами. Тип аргументу повинен відповідати типу параметру або бути узгодженим з ним. Можна використовувати перетворення типів, щоб повідомити компілятору, як привести тип аргументу до відповідного типу параметра.
Наступні приклади показують різницю між параметрами-посиланнями і параметрами-копіями.
Нехай необхідно описати функцію, в яку передаються дві змінні цілого типу (в вигляді параметрів), і у функції ці змінні обмінюються своїми значеннями. Після виконання функції, змінні мають обмінятися значеннями.
Варіант №1:
void swap (int a, int b)
{ int temp;
temp = a;
a = b;
b = temp; }
//основна програма – main:
void main()
{ int a = 10, b = 20;
swap(a,b);}
Ця програма буде виконуватись з логічною помилкою. Після виконання функції нічого не зміниться: а = 10, b = 20.
Варіант №2:
void swap (int& a, int& b)
{ int temp;
temp = a;
a = b;
b = temp; }
//основна програма – main:
void main()
{ int a = 10, b = 20;
swap(a,b);}
Після завершення цієї програми: а = 20, b = 10.
Рекурсія, перевантаження функцій,шаблони функцій (template), вбудовані функції (inline), функція main()з параметрами + Структури, об’єднання, бітові поля
Передача значень за замовчуванням. Рекурсивні функції. Шаблони.
Параметри із значеннями за замовчуванням повинні бути останніми і можуть опускатися під час виклику. Якщо один із параметрів за замовчуванням опущений, то мають опускатися і всі параметри за замовчуванням, які йдуть за ним.
за замовчуванням
d
efault
int f (int a, int b=0)
void f1 (int , int = 100, char * = 0);
void abc (int abc_value = abc0); // abc0 – глобальна змінна або константа
Значення параметрів за замовчуванням можуть бути константами, глобальними змінними або виразами.
Приклад. f(100); f(a,1); f1(a); f1(a,100); f1(a,100, ’cs’)
не можна записувати f1(a,’cs’)
Рекурсивні функції – це функції, в тілі яких міститься виклик тих самих функцій (самих себе). Це пряма рекурсія. Може бути опосередкована рекурсія f1 f2 fn f1
Приклад. n! = 1*2*3* *n n! = n*(n-1)!
an a1 = a an = a*an-1
Приклад рекурсивної функції для n!
long fact (long n) { if ( n == 0 || n == 1) return 1; return (n*fact(n-1)); }
|
або
|
long fact (long n) {return (n>1) ? n*fact(n-1) : 1;} cout << fact (5);
|
|
|
n |
fact |
|
розгортання |
|
5 |
|
згортання |
II |
4 |
24 |
||
III |
3 |
6 |
||
IV |
2 |
2 |
||
V |
1 |
1 |

I
120