Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

7.1.4. Глобальні змінні

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

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

Використання глобальних змінних продемонстровано у наведеному нижче коді програми. Як бачимо, змінні count і num_right оголошені поза всіма функціями, отже, вони глобальні. Із звичайних практичних міркувань краще оголошувати глобальні змінні ближче до початку програми. Але формально вони просто мають бути оголошені до їх першого використання. Пропонована для перегляду програма – тільки простий тренажер з виконання арифметичного додавання. Спочатку користувачу запропоновано вказати кількість вправ. Для виконання кожної вправи викликається функція drill(), яка генерує два випадкові числа в діапазоні від 0 до 99. Користувачу пропонується додати ці числа, а потім перевіряється відповідь. На кожну вправу дається три спроби. В кінці програма відображає кількість правильних відповідей. Зверніть особливу увагу на глобальні змінні, що використовуються у цій програмі.

Код програми 7.5. Демонстрація програми-тренажера з виконання операції додавання

#include <iostream> // Для потокового введення-виведення

#include <cstdlib> // Для використання бібліотечних функцій

using namespace std; // Використання стандартного простору імен

void drill();

int count; // Змінні count і num_right – глобальні.

int num_right;

int main()

{

cout << "Скільки практичних вправ: ";

cin >> count;

num_right = 0;

do {

drill();

count--;

} while(count);

cout << "Ви дали " << num_right << " правильних відповідей.\n";

getch(); return 0;

}

void drill()

{

int count; /* Ця змінна count -- локальна і ніяк

не пов'язана з однойменною глобальною. */

int a, b, ans;

// Генеруємо два числа між 0 і 99.

a = rand() % 100;

b = rand() % 100;

// Користувач отримує три спроби дати правильну відповідь.

for(count = 0; count<3; count++) {

cout << "Скільки буде " << а << " + " << b << "? ";

cin >> ans;

if(ans == a + b) {

cout << "Правильно.\n";

num_right++;

return;

}

}

cout << "Ви використовували всі свої спроби.\n";

cout << "Відповідь дорівнює " << a + b << "\n";

}

При уважному вивченні цієї програми Вам стане зрозуміло, що як функція main(), так і функція drill() отримують доступ до глобальної змінної num_right. Але із змінною count справа йде дещо складніше. У функції main() використовується глобальна змінна count. Проте у функції drill() оголошується локальна змінна count. Тому тут під час використання імені count маємо на увазі саме локальну, а не глобальну змінну count. Необхідно пам'ятати, що, коли у функції глобальна і локальна змінні мають однакові імена, то під час звернення до цього імені маємо на увазі локальну, а не глобальну змінну.

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

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

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

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

Основна проблема, характерна для розроблення великих С++-програм, випадкове модифікування значення змінної у якомусь іншому місці програми. Чим більше глобальних змінних у програмі, тим більшою є ймовірність помилки.