Урок #8

Функції і тип без значень

Що таке функція

Найчастіше в програмі доводиться по кілька разів писати один і той самий код. Така програма стає великою і нечитабельною, створюючи величезні труднощі в супроводі такого коду. Для полегшення роботи були запропоновані функції. Вони і є основою функціонального програмування. Функції мають тип значення, заголовок функції, список аргументів і саме тіло функції, де і поміщається потрібний нам код.

Згадайте головну функцію main. Без неї жодна програма на C ++ не працюватиме. Тепер пора розібратися з описом функції. Як раніше було відмічено, функція має тип значення, який розташовується перед ім’ям даної функції. Далі йде ім’я і в ньому ви маєте повну свободу, називати можна, як тільки душа забажає, але тільки з букв, цифр і знаків підкреслення. Після імені пишеться список аргументів функції. А далі йде саме тіло. Функція, що обчислює квадрат числа наведена в прикладі нижче:

Тепер розберемо по порядку саму програму. Функція має тип int, що цілком логічно, адже аргумент, який ми передаємо на обчислення його квадрата, так само має тип int. Рядок return res позначає дію повернення функцією певного результату. Після того, як процес виконання програми дійшов до інструкції return, він завершує роботу поточної функції. Для більшої наочності, після return можна вивести будь-який рядок. Можна помітити, що вона ніколи не буде виведена в консоль.

Так само можна вказувати і кілька переданих параметрів, які пишуться через кому: int first, int second.

Функція може і не повертати значення. Такі функції називаються процедурами. Так само, як і звичайні функції, процедури повинні повертати якесь значення. Якраз для цього був запроваджений тип void, який не має значень і позначає порожнечу. return в процедурі так само використовується, але тільки для “екстреного” завершення роботи процедури. Наприклад, нам потрібно написати програму, яка виводить перші додатні елементи масиву. Функція закінчить свою роботу, коли будуть виведені всі елементи масиву, або нам зустрінеться від’ємне число:

25
Для продовження натисніть будь-яку клавішу…

Як ви могли помітити, масиви в функції передаються таким способом: спершу вказується ім’я (будь-яке), а потім ставляться подвійні квадратні дужки.

Виклик функцій

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

Функції в програмі викликаються дуже просто. Для цього необхідно написати ім’я функції і передати їй відповідні параметри. Навіть якщо параметрів немає, скобочки після імені вказувати обов’язково. Типи фактичних і формальних параметрів повинні бути однаковими, або сумісними. Під сумісними типами мається на увазі їх перетворення під тип формального параметра. Тобто тип short int буде “розширено” до int і втрати даних не відбудеться. А тип long long – навпаки, буде “звужений” до int, і в цьому випадку можлива втрата даних.

Визначення прототипів функцій

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

Що б визначити прототип функції, достатньо лише написати її шапку із зазначенням типу значення, що повертається і типів аргументів. Наприклад, функція зведення числа в квадрат матиме такий прототип: int square (int). А програма з цією функцією виглядає так:

Як бачимо, нічого складного. Головне – описувати прототипи функції перед їх використанням.

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

Перевантаження функцій має під собою одне ім’я для різних реалізацій функції. Візьмемо вже добре відому нам функцію square. Вона реалізована таким чином, що може працювати лише з даними типу int. Якщо ж функції передати дані іншого типу, то їх тип буде змінений на int, що може спричинити за собою втрату даних. Наприклад, тип double, який використовується для дрібних чисел, втратить свою дробову частину. Тому для зведення в квадрат нам доведеться зробити іншу функцію, яка буде мати параметри і повертається тип double. Але створювати нову функцію square_double виходить занадто витратним, адже в програмі нам доведеться стежити за функціями: де використовувати звичайний square, а де square_double. Що б уникнути цього, було придумане перевантаження. Як раніше було відмічено, перевантаження має на увазі під собою створення функцій з однаковими іменами, але з різними параметрами. Тоді програма, що підносить в квадрат якесь число, буде мати такий вигляд:

25
1.5625
100000000000000
Для продовження натисніть будь-яку клавішу…

Можливі питання за темою:

Питань ще нема

Додавайте свої питання в коментарі. Кращі потраплять до статті 🙂


Урок #7 Урок #9