Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л6. Функц_ї в мов_ С++.doc
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
102.4 Кб
Скачать

Функції в мові С++

1. Означення функції

У C++ прості частини складної програми реалізуються за допомогою функцій. В термінології ООП функції – це методи, за допомогою яких об’єкти опрацьовують повідомлення. Окремі функції об'єднують у спільну програму. У відкомпільованому вигляді така програма утворює модуль. Головна функція, що обов'язково входить до кожної програми, - main(). Розрізняють стандартні функції та функції користувача. Стандартні функції мови описані (визначені) у бібліотеках.

Функція – це поіменована послідовність описів і операторів, які виконують деякі логічно завершені дії. До функції можна звертатись (викликати) з будь-якого місця програми необхід­ну кількість разів. Функція може отримувати дані через параметри і повертати їх через ім’я.

Кожна функція повинна бути оголошена і означена.

2. Синтаксис функції.

[клас пам’яті] <тип ф-ї> <ім’я ф-ї> (<список формальних параметрів>)

{

<тіло функції>;

return (<змінна>); }

Клас пам’яті - задає область видимості функції. Extern – глобальна видимість у всіх модулях програми. Static – видимість в межах модуля, де означена функція.

Тип ф-ї – це тип даного, який функція повертає в основну програму. Тип функції можна не зазначати. За замовчуванням функція повертає у програму дане цілого типу int. Функцію, яка не повертає у програму жодного результату, оголошують з типом void.

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

Ім’я функції задає користувач за правилом створення ідентифікаторів.

У списку формальних параметрів через кому записують змінні, зазначаючи їхні типи. Тип необхідно зазначати для кожної змінної окремо. Імена змінних можна опускати. Якщо функція не набуває жодних значень, то список формальних параметрів може бути відсутній. Круглі дужки опускати не можна. Параметри: під час опису – формальні, під час виклику – фактичні.

У тілі функції записують команди, які задають дію функції. Результат виконання функції повертається в основну програму (у точку виклику) за допомогою змінної командою return. Тип змінної має збігатися з типом функції. У тілі функцій типу void команду return не зазначають. У команді return круглі дужки можна не писати

Для виклику функції необхідно вказати її ім’я та фактичні параметри:

<ім’я функції>(<список фактичних параметрів>)

Не є обов’язковими

Приклад.

int sum (int a, int b);

main () { int a=2, b=3, c, d;

c=sum (a,b);

cin >> d;

cout << sum (c,d); }

int sum (int a, int b) // означення

{ return (a+b) }

Прототипи функцій

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

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

Крапка з комою в кінці необхідна для прототипу, але не потрібна для реалізації функції.

3. Розподіл пам’яті.

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

v

Локальна статична змінна n буде розташована в області даних і буде ініціалізована лише один раз під час першого виконання оператора, який містить її значення

oid f (int a)

{ int m=0;

c out << " n m p \ n ";

while ( a -- )

{ static int n=0;

int p=0;

cout << n++ << ’ ’ << m++ << ’ ’<< p++ << ’ \n’; }

}

main ( )

{ f(3); f(2); }

n

m

p

0

0

0

1

1

0

2

2

0

3

0

0

4

1

0

n = 3 – бо значення зберігається

4. Параметри функції

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

1 – за значенням;

2 – за адресою

1) В стек заносяться копії фактичних параметрів і оператори функції працюють з цими копіями. Доступу до вихідних значень параметрів функція не має, отже – не може їх змінювати.

2) В стек заносяться копії адрес параметрів і функція здійснює доступ до комірок пам’яті за цими адресами і, отже, може змінювати вихідні значення параметрів

Приклад до 2.

void f (int i, int *j, int &k);

main ()

{ int i=1, j=2, k=3;

cout << " i j k " \n ";

cout << i << ’ ’ << j << ’ ’ << k << ’ \n’;

f (i, &j, k);

cout << i << ’ ’ << j << ’ ’ << k << ’ \n’;

}

передача адреси за допомогою вказівника

void f (int, int *j, int &k)

{

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

i++; (*j)++; k++ }

автоматично

Якщо значення параметра функції не можна змінювати, то він описується з const.

Наприклад, int sort(const int *p, const int *g);