- •Міністерство освіти і науки україни
- •2.2 Опис функції
- •2.3. Вихід з функції
- •2.4. Виклик функції
- •2.5. Прототип функції
- •2.6. Способи передачі агрументів
- •2.6.1. Виклик функції з передачею значення
- •2.6.2. Виклик функції з передачею адреси
- •2.7. Локальні та глобальні змінні
- •3. Контрольні запитання
- •4. Лабораторне завдання
- •5. Список літератури
- •Індивідуальні завдання
2.6. Способи передачі агрументів
Мова С++ має два способи передачі аргументів: передача аргументів за значенням і передача аргументів за посиланням(адресою).
2.6.1. Виклик функції з передачею значення
При цьому способі виклику функції значення аргументу копіюється у відповідний формальний параметр функції. Тому зміни значення цього параметра всередині функції не впливають на значення змінних, які використовувалися для виклику. В усіх розглянутих раніше прикладах використовувався сам цей спосіб передачі аргументів. Саме через те, що у стек записуються лише копії значень аргументів функції (стек-це спеціальна ділянка оперативної пам’яті через яку відбувається передача аргументів у функції), у ролі аргументів можуть виступати як змінні та константи, так і вирази, які повертають значення потрібного типу (тобто типу формального параметра.
Приклад.
/* приклад виклику функції з передачею значення */
#include<iostream>
#include<conio.h>
int square(int); // прототип функції
using namespace std;
void main()
{
int p=5;
cout<<"p="<<p<<" p*p="<<square(p)<<" p="<<p<<endl;
_getch();
}
int square (int x) // опис функції
{ x*=x; return x; }
У цьому прикладі значення аргументу для функції square()(тобто 5) скопіювалося у параметрx. Коли відбулося присвоєнняx*=x, змінилося значення лише формального параметруx. Зміннаp, яка використовувалася у ролі аргумента при викликуsquare(), і надалі має значення 5, тому на екран виведеться такий рядок:p=5 p*p=25 p=5.
2.6.2. Виклик функції з передачею адреси
При цьому способі виклику функції передається не копія значення аргумента, а його адреса. Це означає, що всередині функції, яка викликається, ми маємо доступ до оригінала значення аргумента (через його адресу). Тому будь-яка модифікація відповідного формального параметра всередині функції означає й одночасну зміну аргумента. Для того, щоб вказати, що у функцію має передаватися адреса, опис відповідного формального параметра повинен використовувати операцію адресації &, як це показано в наступному прикладі.
/* приклад виклику функції з передачею адреси */
#include<iostream>
#include<conio.h>
int square(int &); // прототип функції
using namespace std;
void main()
{
int p=5;
cout<<"p="<<p<<" p*p="<<square(p)<<" p="<<p<<endl;
_getch();
}
int square (int &x) // опис функції
{
x*=x;
return x;
}
Тут, при виклику функції square() було передано адресу аргумента (тобто змінної p). Ця адреса тепер використовується для доступу до комірки пам’яті, в якій зберігається значення змінної p. Тому тепер присвоєнняx*=xзмінює не лише значення формального параметруx, а й значення змінноїp, яка використовується у ролі аргументу при виклику функції. Як наслідок, на екран виведеться такий рядок:p=5 p*p=25 p=25.
Слід зауважити, що коли використовується передача аргумента за адресою (посиланням), то у ролі самого аргумента можна використовувати лише змінні (константи і вирази використовувати заборонено).
2.7. Локальні та глобальні змінні
Усі змінні, оголошені всередині довільної функції є локальнимизмінними цієї функції. Це означає, що їх значення зберігаються тільки на час виконання цієї функції. Інколи кажуть, що локальні змінні маютьобласть видимостіобмежену тілом функції, в якій вони оголошені. Усі формальні параметри функції розглядаються також як локальні змінні цієї функції. Усі змінні, оголошені поза межами всіх функцій з яких складається програма, називаютьсяглобальними. Доступ до таких змінних можливий у будь-якій функції. Іншими словами, область видимості глобальних змінних обмежена лише файлом у якому знаходиться вихідний код програми.
У мові С++ поняття локальності змінних є дещо глибшим і розширеним у порівнянні з іншими мовами програмування (наприклад, з мовою Паскаль). Локальні змінні можна оголошувати у довільному місці функції в межах так званого програмного блокупід яким розуміють довільну послідовність оголошень та операторів, яка знаходиться між парою фігурних дужок {}. Тіло довільної функції в С++ також розглядається як програмний блок. У цьому випадку змінна є локальною по відношенню до блоку в якому вона оголошена і її область видимості обмежена цим блоком. Більше того, в С++ дозволяється використовувати однакові ідентифікатори для позначення змінних в різних блоках. Це можливо завдяки вбудованому механізму перекриття імен мови С++. Наступний приклад програми демонструє ці можливості.
#include <iostream>
#include <conio.h>
void a (void); // прототип функції
int x=1; // глобальна змінна
using namespace std;
void main()
{
int x = 5; // локальна змінна функції main
cout << "x=" << x <<endl;
{
int x=7; // локальна змінна внутрішнього блоку main
cout << "x=" << x <<endl;
} _
cout << "x=" << x << "\n";
a();
_getch();
}
void a(void) // опис функції a_
{
cout << "x=" << x++ << "\n";
}
Результат виконання цієї програми зображено на рис.1.

Рис.1. Результат виконання програми, яка демонструє механізм перекриття імен мови С++
