Основні теоретичні відомості

Функції – це будівельні блоки деякої програми на мові С++.

Функції бувають двох типів:

– функції користувачів (включно main());

– стандартні (бібліотечні) функції мови С та С++.

Форма запису функцій:

тип_результату ім’я_функції (список_параметрів);

{

//Тіло функції

}

де тип_результату – задає тип данних, що повертаються функцією, список_параметрів – задає список змінних, що передаються функції при зверненні.

Дуже важливим оператором тіла функції є оператор повернення в точку виклика:

return вираз; або return;

Вираз в операторі return визначає значення, що повертається функцією. Саме це значення буде результатом звернення до функції.

Навіть у випадку, коли функція не виконує ніяких дій й не повинна повертати деяке значення, тіло функції буде складатися з фігурних дужок {}.

Приклад:

int max(int a, int b) {

if (a>b) return a;

else return b;}

Суворе узгодження за типами між формальними та фактичними параметрами потребує, щоб у модулі до першого звернення до функції містилося або її визначення, або її опис (прототип), що містить інформацію про її тип (про тип результату, тобто повертаємого значення) та про типи всіх параметрів. Прототип (опис) функції може зовнішньо співпадати зі заголовком її визначення:

тип_функції ім’я_функції(специфікація_формальних_параметрів);

Наприклад:

int max(int a, int b);

У визначенні функції специфікація параметра може містити його значення за замовченням. Це значення використовується у тому випадку, якщо при зверненні до функції відповідний параметр відсутній.

Наприклад:

int max (int a, int b=0);

Функція main()

Функція main() не має прототипа. Тобто, можна використовувати різні форми запису функції main(). Для мови С++ мають місце наступні варіанти функції main()(дозволяються й інші форми):

1. int main();

2. int main(int argc, char *argv[]);

Як видно з другої форми запису, функція main() підтримує два параметра – argc та argv. Ці дві змінні будуть зберігати кількість аргументів командного рядка та покажчик на них. Параметр argc має цілий тип, та його значення завжди буде не менше за 1, тому що у мові С++, першим аргументом завжди є ім’я програми. Параметр argv повинен бути оголошений як масив символьних покажчиків, в якому кожний елемент вказує на аргумент командного рядку.

В функцію можна передати покажчик на масив. Функції можуть повертати покажчик на масив в якості результата.

Посилання в мові С++

В мові С++ посиланням є інше ім’я існуючого об’єкту. Для визначення посилання використовується символ &, якщо він використовується у такому контексті:

type&ім’я_посилання ініціалізатор

У відповідності із синтаксисом ініціалізатора, наявність якого обов’язкове, визначення посилання може бути таким:

type&ім’я_посилання=вираз; або type&ім’я_посилання(вираз);

При визначенні посилання обов’язковою є його ініціалізація. Однак в опису посилань ініціалізація не обов’язкова. До таких описів посилань відносяться:

а) опис зовнішніх посилань (через специфікатор extern):

float& ref; //Помилка – немає ініціалізації

extern float& ref2; //Допустимо – ініціалізується

//в іншому блоці;

б) опис компонентів класу;

в) описи (специфікації) формальних параметрів функції;

г) опис типу значення, що повертається функцією.

В якості основних причин включення посилань у мові С++ позначають необхідність збільшити ефективність обміну з функціями через апарат параметрів та доцільність можливості використовувати визивання функції в якості леводопустимого значення. При використанні посилання в якості формального параметра забезпечується доступ з тіла функції до відповідного фактичного параметра, тобто до ділянки пам’яті, що виділяється під фактичний параметр.

Перевантаження функцій

Мета перевантаження функцій складається в тому, щоб функція із одним ім’ям по-різному виконувалася та повертала різні значення при звертанні до неї із різними за типом та кількістю фактичними параметрами.

Для забезпечення перевантаження функцій необхідно для кожного імені визначити скільки різних функцій пов’язано з ним, тобто скільки варіантів сигнатур є допустимими при зверненні до них. Будемо вважати, що функція вибору максимального значення елемента із масиву має працювати для масивів типу int, long, float, double. В цьому випадку треба написати чотири різні варіанти функції з одним ім’ям.

int max (int a, int b);

float max (float a, float b);

char max (char a, char b);

При виклику перевантаженої функцій компілятор точно визначає, яку з версій функції треба використовувати. Рішення компілятора основане на результатах аналізу кількості та типу аргументів. Визивається функція, що найточніше відповідає “моделі” виклику.

Контрольні запитання

1. Що таке блок?

2. Що таке функція на мові С(С++)? Для чого вона застосовується?

3. Опишіть механізм передачі параметрів у функцію.

4. Як використовується оператор return у функції?

5. Що ми маємо на увазі, коли говоримо про тип функції?

6. Чим відрізняються прототип, визначення і виклик функції?

7. Які можливо передати параметри до функції main()?

8. Що таке перевантаження функцій? Для чого воно застосовується?

9. Навести приклади прототипів перевантажених функцій із сигнатурами, що розрізняються за кількістю аргументів і за типом аргументів.