C ++. Функції. Приклади використання. параметри функції

  1. зміст 1. Що таке функція? Визначення функції. Переваги використання функцій
  2. 2. Яка загальна форма опису функції?
  3. 3. Приклади опису і використання функцій, які не повертають значення
  4. 4. Приклади опису і використання функцій, які отримують один параметр
  5. 5. Приклади опису і використання функцій, які отримують два і більше параметра
  6. 6. Які існують способи передачі параметрів у функцію? приклад
  7. 7. Що таке формальні і фактичні параметри функції? приклад
  8. 8. Яка область видимості формальних параметрів функції? приклад
  9. 9. Що таке прототип функції? приклад
  10. пов'язані теми

зміст

1. Що таке функція? Визначення функції. Переваги використання функцій

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

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

Функція - це частина програми, яка має такі властивості або ознаки:

  • є логічно самостійною частиною програми;
  • має ім'я, на підставі якого здійснюється виклик функції (виконання функції). Ім'я функції має відповідати правилам створення ідентифікаторів мови C ++ ;
  • може містити список параметрів, які передаються їй для обробки або використання. Якщо функція не містить списку параметрів, то така функція називається функцією без параметрів;
  • може повертати (не обов'язково) деяке значення. У разі, якщо функція не повертає ніякого значення, тоді вказується ключове слово void;
  • має власний програмний код, який розташований між фігурними дужками {}. Програмний код вирішує завдання, поставлене на цю функцію. Програмний код функції, реалізований в фігурних дужках, називається «тіло функції».

Використання функцій в програмах дає наступні переваги:

  • компактна організація програми шляхом зручного виклику програмного коду по його імені, який в програмі може зустрічатися кілька разів (повторюватися);
  • економія пам'яті, розміру початкового та виконавчого коду і т.д .;
  • зменшення ризику виникнення помилок для великих наборів кодів;
  • підвищення читабельності програмного коду.

2. Яка загальна форма опису функції?

Загальна форма опису функції виглядає наступним чином:

тип імя_функциі (спісок_параметров або void){тело_функціі[return] (вираз);}

де

  • тип - тип значення, що повертається функцією. Якщо поле «тип» містить ключове слово void, то функція не повертає ніякого значення;
  • імя_функциі - це безпосередньо ім'я функції. З цього імені здійснюється виклик програмного коду, реалізованого в теле_функціі. Крім того, імя_функциі є покажчиком на цю функцію . Значним покажчика є адреса точки входу в функцію;
  • спісок_параметров - параметри, які передаються в функцію. Функція може отримувати будь-яке число параметрів. Якщо описується функція без параметрів, то в дужках вказується ключове слово void;
  • тело_функціі - набір операторів програмного коду, що реалізують алгоритм обчислення всередині функції;
  • return (вираз) - ключове слово return вказує, що функція повертає значення задане в (вираз). Слово return може зустрічатися в декількох місцях тіла функції в залежності від алгоритму (повторюватися).

3. Приклади опису і використання функцій, які не повертають значення

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

Приклад 1. Функція MyFunc1 () без параметрів, яка не повертає значення.

Якщо в тілі деякого класу або модуля описати функцію:

// опис функції, яка не отримує і не повертає параметрів void MyFunc1 (void) {// тіло функції - висновок тексту на форму в елемент управління label1 label1-> Text = "MyFunc1 () is called"; return; // повернення з функції}

тоді викликати цю функцію можна в такий спосіб:

... // виклик функції з іншого програмного коду (наприклад, обробника події) MyFunc1 (); ...

Приклад 2. Функція MyFuncMult2 (), яка отримує один параметр цілого типу і не повертає значення. Функція здійснює множення отриманого параметра на 2 і виводить результат на форму в елементі управління label1.

// функція, яка отримує ціле число, примножує його на 2 і виводить результат void MyFuncMult2 (int x) {int res; // внутрішня змінна res = x * 2; // обчислення результату label1-> Text = res.ToString (); // вивід результату на форму return; }

Виклик функції з іншого програмного коду:

// виклик функції з обробника події MyFuncMult2 (42); // буде виведений 84 MyFuncMult2 (-8); // -16

Приклад 3. Функція, яка отримує 2 параметра типу double, знаходить їх твір і виводить його на форму в елементі управління label1.

// функція, яка множить параметр x на параметр y і виводить результат на форму void MyFuncMultDouble (double x, double y) {double z; z = x * y; label1-> Text = z.ToString (); return; }

Виклик функції з іншого програмного коду:

... MyFuncMultDouble (2.5, -2.0); // буде виведено -5 MyFuncMultDouble (1.85, -2.23); // буде виведено -4.1255 ...

4. Приклади опису і використання функцій, які отримують один параметр

Приклад 1. Функція, яка отримує один параметр цілого типу, примножує його на 5 і повертає результат. Функція не виконує виведення результату.

// функція, яка множить параметр на 5 int Mult5 (int d) {int res; res = d * 5; return res; // повернення результату}

Виклик функції з іншого програмного коду

... // виклик функції з іншого програмного коду int x, y; x = 20; y = Mult5 (x); // y = 100 y = Mult5 (-15); // y = -75 ...

Приклад 2. Функція обчислення значення y = sign (x), що визначається за правилом:

Реалізація функції: Реалізація функції:

int sign (float x) {if (x <0) return -1; if (x == 0) return 0; if (x> 0) return 1; }

Виклик функції з іншого програмного коду:

... int res; res = sign (-0.399f); // res = -1 res = sign (0.00f); // res = 0 res = sign (2.39); // res = 1 ...

5. Приклади опису і використання функцій, які отримують два і більше параметра

Приклад 1. Приклад функції MaxFloat (), яка отримує 2 параметра типу float і повертає максимум з них.

// функція, яка знаходить максимум між двома числами float MaxFloat (float x, float y) {if (x> y) return x; else return y; }

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

Виклик функції MaxFloat () з іншого програмного коду:

// виклик функції з іншого програмного коду float Max; // змінна - результат Max = MaxFloat (29.65f, (float) 30); // Max = 30.0 double x = 10.99; double y = 10.999; Max = MaxFloat (x, y); // Max = 10.999 Max = MaxFloat ((float) x, (float) y); // Max = 10.999 - так надійніше

Приклад 2. Функція MaxInt3 (), яка знаходить максимальне значення між трьома цілими числами.

// функція, яка знаходить максимум між трьома цілими числами // функція отримує 3 цілочисельних параметра з іменами a, b, c int MaxInt3 (int a, int b, int c) {int max; max = a; if (max <b) max = b; if (max <c) max = c; return max; }

Виклик функції з іншого програмного коду

// виклик функції з іншого програмного коду int a = 8, b = 5, c = -10; int res; res = MaxInt3 (a, b, c); // res = 8 res = MaxInt3 (a, b + 10, c + 15); // res = 15 res = MaxInt3 (11, 2, 18); // res = 18

6. Які існують способи передачі параметрів у функцію? приклад

У C ++ існує 3 способи передачі параметрів у функцію:

  • передача параметра за значенням (Call-By-Value). Це проста передача копій змінних в функцію. У цьому випадку зміна значень параметрів в тілі функції не змінить значень, які передавалися в функцію ззовні (при її виклику);
  • передача параметра за адресою змінної. У цьому випадку функції в якості параметрів передаються не копії змінних, а копії адрес змінних, тобто покажчик на змінну. Використовуючи цей покажчик функція здійснює доступ до потрібних осередків пам'яті де розташована передана змінна і може змінювати її значення. Загальні відомості про покажчики наведені тут ;
  • передача параметра за посиланням (Call-By-Reference). Передається посилання (покажчик) на об'єкт (змінну), що дозволяє синтаксично використовувати це посилання як покажчик, і як значення. Зміни, внесені в параметр, який передається по посиланню, змінюють вихідну копію параметра викликає функції.

Приклад. Цей приклад демонструє відмінність між передачею параметрів за значенням, за адресою та за посиланням. Використання функцій, яка отримує три параметри. Перший параметр (x) передається за значенням. Другий параметр (y) передається за адресою (як покажчик). Третій параметр (z) передається по посиланню.

// функція MyFunction // параметр x - передається за значенням (параметр-значення) // параметр y - передається за адресою // параметр z - передається по посиланню void MyFunction (int x, int * y, int & c) {x = 8; // параметр змінюється тільки в межах тіла функції * y = 8; // параметр змінюється і за межами функції z = 8; // параметр змінюється і за межами функції return; }

Демонстрація виклику функції MyFunction () з іншого програмного коду:

int a, b, c; a = b = c = 5; // виклик функції MyFunction () // параметр a передається за значенням a-> x // параметр b передається за адресою b-> y // параметр c передається по посиланню c-> z MyFunction (a, & b, c); // на виході a = 5; b = 8; c = 8;

Як видно з результату, значення змінної a не змінилося. Мінлива a передавалася в функцію MyFunction () з передачею значення (перший параметр).

Однак, значення змінної b після виклику функції MyFunction () змінилося. Це пов'язано з тим, що в функцію MyFunction () передавалося значення адреси змінної b. Маючи адресу змінної b в пам'яті комп'ютера, всередині функції MyFunction () можна змінювати значення цієї змінної за допомогою покажчика y.

Точно так же змінилося і значення c після виклику функції. Посилання є адреса об'єкта в пам'яті. За допомогою цієї адреси можна мати доступ до значення об'єкта.

7. Що таке формальні і фактичні параметри функції? приклад

Формальні параметри - це змінні, які беруть значення аргументів (параметрів) функції. Якщо функція має кілька аргументів (параметрів), їх тип і імена розділяються комою ','.

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

Приклад. Функція MyAbs (), що знаходить модуль числа має один формальний параметр x.

// функція, яка знаходить модуль дійсного числа float MyAbs (float x) // x - формальний параметр {if (x <0) return (float) (- x); else return x; }

Виклик функції з іншого програмного коду (іншої функції)

// виклик функції з іншого програмного коду float res, a; a = -18.25f; res = MyAbs (a); // res = 18.25f; змінна a - фактичний параметр res = MyAbs (-23); // res = 23; константа 23 - фактичний параметр

При виконанні функції з іншого програмного коду має місце фактичний параметр. В даному прикладі фактичний параметр це змінна a і константа 23.

При виконанні функції фактичні параметри копіюються в спеціальні осередки пам'яті в стеку (стек - частина пам'яті). Ці осередки пам'яті відведені для формальних параметрів. Таким чином, формальні параметри (через використання стека) отримують значення фактичних параметрів.

Оскільки, фактичні параметри копіюються в стек, то зміна значень формальних параметрів в тілі функції не змінить значень фактичних параметрів (так як це є копія фактичних параметрів).

8. Яка область видимості формальних параметрів функції? приклад

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

Приклад. Функція, яка обчислює факторіал цілого числа n.

// функція, яка обчислює n! unsigned long int MyFact (int n) // початок області видимості формального параметра n {int i; unsigned long int f = 1; // результат for (i = 1; i <= n; i ++) f = f * i; return f; // кінець області видимості формального параметра n}

Виклик функції з іншого програмного коду (іншої функції):

// виклик функції з іншого програмного коду int k; unsigned long int fact; k = 6; fact = MyFact (k); // fact = 6! = 720

9. Що таке прототип функції? приклад

Прототип функції дозволяє уникнути помилок при передачі фактичних параметрів в формальні параметри.

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

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

Приклад. Нехай дана функція Div (), яка отримує 2 числа типу long int і повертає результат ділення без остачі цих чисел. Функція не має прототипу (див. Далі).

// функція, яка ділить 2 числа без остачі long int Div (long int x, long int y) {long int res; res = x / y; // результат - ціле число return res; }

Якщо в іншому програмному коді написати:

... // виклик функції з іншого програмного коду int a, b, c; a = 290488; b = -223; c = Div (a, b); // правильну відповідь: c = -1302. Значення c може бути помилковим ...

тобто ризик виникнення помилкового результату в змінної c. Це пов'язано з тим, що при виконанні функції компілятор не має інформації про тип формальних параметрів (x, y), які використовуються в функції. Компілятор вважає, що тип параметрів в функції такий же як і тип фактичних параметрів (змінні a, b), тобто тип int. Однак, функція Div () використовує значення параметрів типу long int, який в пам'яті має велику розрядність ніж тип int. Тому, може виникнути спотворення значень.

Щоб уникнути такої помилки рекомендується давати прототип функції. В даному випадку прототип має вигляд:

long int Div (long int, long int);

У прототипі вказується:

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

Якщо функція описується в класі і зголоситься з методів цього класу, тоді подібних помилок не буде. Це пов'язано з тим, що в класі прототип функції відомий всім методам класу.

пов'язані теми

1. Що таке функція?
2. Яка загальна форма опису функції?
6. Які існують способи передачі параметрів у функцію?
7. Що таке формальні і фактичні параметри функції?
8. Яка область видимості формальних параметрів функції?
9. Що таке прототип функції?
1. Що таке функція?
2. Яка загальна форма опису функції?
6. Які існують способи передачі параметрів у функцію?
7. Що таке формальні і фактичні параметри функції?