Назад Зміст Вперед

Область видимості змінних

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

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

Залежно від області видимості створювані об'єкти можуть бути глобальними або локальними.

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

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

У даній програмі змінна n є глобальною і доступна з будь-якої функції.

При цьому будь-яка функція може змінити її значення.

#include <iostream>
using namespace std;

void print();

int n=5;

int main()
{
    print();
    n++;
    cout << "main: n=" << n << endl;
    return 0;
}
void print()
{
    n++;
    cout << "print: n=" << n << endl;
}

Результат:

Локальні змінні

Змінні, які створюються всередині блоку (всередині фігурних дужок), називаються локальними.

Такі змінні доступні в межах тільки того блоку коду, в якому вони визначені.

Блок може представляти функцію або будь-яку іншу конструкцію типу циклу. Приклад коду на C++

#include <iostream>
using namespace std;

void print(int);

int main()
{
    int z=2;
    print(z);
    // n++; так сделать нельзя, так как n оголошена в функції print
    return 0;
}

void print(int x)
{
    int n=5*x;
    // z++; так сделать нельзя, так как z оголошена в функції main
    cout << "print: n=" << n << endl;
}

Тут у функції print визначена локальна змінна n. У функції main визначена локальна змінна z. Поза своїх функцій ці змінні недоступні.

Наприклад, ми не можемо використовувати змінну n в функції main, так як її область видимості обмежена print.

Відповідно також ми не можемо використовувати змінну z в функції print, так як ця змінна обмежена main.

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

Область видимості змінних

За допомогою блоку коду можна визначити вкладені області видимості:

#include <iostream>
using namespace std;

int main()
{
    int n=2;
    {
        int x=5;
        cout << "x=" << x << endl;
        n++; // Так можна, так як n оголошена во внешнем контексте
    }
    // Так нельзя, так как x оголошена в блоку кода
    cout << "n=" << n << endl;
    return 0;
}

Для кожної області видимості доступні всі ті об'єкти, які визначені у зовнішній області видимості або в зовнішньому контексті.

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

А функція є зовнішнім контекстом для вкладеного блоку коду, тому блок коду може використовувати змінну n, яка визначена в функції поза цим блоку. Однак змінну x, описану в блоці коду, поза цим блоку використовувати не можна.

Приховування змінних

Локальні змінні, визначені всередині одного блоку, можуть приховувати змінні з тим же ім'ям, що описані в зовнішньому блоці:

#include <iostream>
using namespace std;

int n=5;

int main()
{
    cout << "n=" << n << endl;
    int n=10;
    cout << "n=" << n << endl;
    {
        int n=20;
        cout << "n=" << n << endl;
    }
    return 0;
}

Тут визначено три змінних з ім'ям n.

Змінна n, що описана у функції main (int n = 10;) приховує глобальну змінну n = 5.

А змінна n=20, що описана у блоці, приховує змінну n, описану у функції main.

Автоматичні змінні

Локальні змінні, які існують тільки під час виконання того блоку, в якому вони визначені, є автоматичними.

Тобто, при вході в блок для подібних змінних виділяється пам'ять, а після завершення роботи цього блоку, виділена пам'ять звільняється, а змінні видаляються.

#include <iostream>
using namespace std;

void print();

int main()
{
    print();
    print();
    print();
    return 0;
}

void print()
{
    int n=0;
    n++;
    cout << "n=" << n << endl;
}

Функція print викликається три рази, і при кожному виклику програма повторно виділятиме пам'ять для змінної n, яка визначена в функції. А після завершення роботи print, пам'ять для змінної n буде звільнятися.

Відповідно її значення при кожному виклику буде незмінно:

Статичні змінні

Крім автоматичних є особливий тип локальних змінних - статичні змінні. Вони визначаються за допомогою ключового слова static.

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

У попередній програмі зробимо змінну n статичної:

#include <iostream>
using namespace std;

void print();

int main()
{
    print();
    print();
    print();
    return 0;
}

void print()
{
    static int n=0;
    n++;
    cout << "n=" << n << endl;
}

До змінної n було додано ключове слово static, тому при завершенні роботи функції print змінна n не знищується, навпаки, вона зберігається в пам'яті.

І відповідно результат роботи програми буде іншим:

Назад Зміст Вперед