Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
51
Добавлен:
12.02.2016
Размер:
171.01 Кб
Скачать

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. Результат виконання програми, яка демонструє механізм перекриття імен мови С++

Соседние файлы в папке ОП (лаби) [1-13]