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

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

Будь-яка функція повинна бути оголошена і визначена.

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

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

тип імя_функциі ([список_формальных_параметров])

{Тело_функціі}

• Тело_функціі - це блок або складений оператор. Усередині функції не можна визначити іншу функцію.

У тілі функції повинен бути оператор, який повертає отримане значення функції в точку виклику. Він може мати 2 форми:

1) return вираз;

2) return;

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

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

• Список формальних параметрів - це ті величини, які потрібно передати у функцію. Елементи списку розділяються комами. Для кожного параметра вказується тип та ім'я. В оголошенні імена можна не вказувати.

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

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

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

Основним способом обміну інформацією між викликав і викликає функціями є механізм параметрів. Існує два способи передачі параметрів у функцію: за адресою і за значенням.

• При передачі по значенню виконуються наступні дії:

- Обчислюються значення виразів, що стоять на місці фактичних параметрів;

- В стеку виділяється пам'ять під формальні параметри функції;

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

void Change (int a, int b) / / передача за значенням

{

int r = a;

a = b;

b = r;

}

int main ()

{

int x = 1, y = 5;

Change (x, y);

cout << "x =" << x << "y =" << y; / / виведеться: x = 1 y = 5

return 1;

}

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

void Change (int * a, int * b) / / передача за адресою

{

int r = * a;

* A = * b;

* B = r;

}

int main ()

{

int x = 1, y = 5;

Change (& x, & y);

cout << "x =" << x << "y =" << y; / / виведеться: x = 5 y = 1

return 1;

}

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

Формат оголошення посилання

тип & ім'я = імя_об'екта;

Посилання не займає додаткового простору в пам'яті, вона є просто іншим ім'ям об'єкта.

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

void Change (int & a, int & b)

{

int r = a;

a = b;

b = r;

}

int main ()

{

int x = 1, y = 5;

Change (x, y);

cout << "x =" << x << "y =" << y; / / виведеться: x = 5 y = 1

return 1;

}

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

2.2. Локальні та глобальні змінні

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

• Глобальні змінні - це змінні, описані поза функцій. Вони видно у всіх функціях, де немає локальних змінних з такими іменами.

2.3. Передача одновимірних масивів як параметрів функції

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

void print (int a [100], int n) / / вивід масиву на друк

{

for (int i = 0; i <n; i + +)

cout << a [i] << "";

cout << "\ n";

}

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

2.4. Передача багатовимірних масивів у функцію

Багатовимірний масив - це масив, елементами якого служать масиви. Наприклад, масив int a [4] [5] - це масив з вказівників int *, які містять імена однойменних масивів з 5 цілих елементів:


Рисунок 14 – Виділення пам'яті під масив, елементами якого є масиви.

При передачі багатовимірних масивів у функцію все розмірності повинні передаватися в якості параметрів.

const int N = 4;/ / глобальна змінна

void transp (int a [] [N], int n) / / транспонування матриці

{

int r;

for (int I = 0; I <n; I + +)

for (int j = 0; j <n; j + +)

if (I <j)

{

r [a [I] [j];

a [I] [j] = a [j] [I];

a [j] [I] = r;

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: