В этом уроке мы рассмотрим концепцию области видимости переменных в C++ и как она влияет на использование переменных в программе.

Что такое область видимости?

Область видимости определяет, где в программе переменная может быть использована. В C++ есть несколько типов областей видимости:

  • Глобальная область видимости
  • Локальная область видимости (блочная)
  • Область видимости функции
  • Область видимости класса (которую мы рассмотрим позже)

Глобальная область видимости

Переменные, объявленные вне всех функций, имеют глобальную область видимости. Они доступны в любом месте программы после их объявления.

#include <iostream>

int globalVar = 10; // глобальная переменная

void printGlobal() {
    std::cout << "Глобальная переменная: " << globalVar << std::endl;
}

int main() {
    printGlobal(); // выведет 10
    globalVar = 20;
    printGlobal(); // выведет 20
    return 0;
}

Примечание: Использование глобальных переменных часто считается плохой практикой, так как они могут привести к трудноотслеживаемым ошибкам и усложнить понимание кода.

Локальная область видимости

Переменные, объявленные внутри блока кода (ограниченного фигурными скобками), имеют локальную область видимости. Они доступны только внутри этого блока.

int main() {
    {
        int localVar = 5; // локальная переменная
        std::cout << localVar << std::endl; // OK
    }
    // std::cout << localVar << std::endl; // Ошибка! localVar не существует здесь
    return 0;
}

Область видимости функции

Параметры функции и переменные, объявленные внутри функции, имеют область видимости этой функции.

void exampleFunction(int param) {
    int localVar = 10;
    std::cout << param << " " << localVar << std::endl;
}

int main() {
    exampleFunction(5); // OK
    // std::cout << param << std::endl; // Ошибка! param не существует здесь
    // std::cout << localVar << std::endl; // Ошибка! localVar не существует здесь
    return 0;
}

Затенение переменных

Когда локальная переменная имеет то же имя, что и глобальная, локальная переменная “затеняет” глобальную в своей области видимости.

int x = 10; // глобальная переменная

int main() {
    int x = 20; // локальная переменная
    std::cout << x << std::endl; // выведет 20 (локальная переменная)
    std::cout << ::x << std::endl; // выведет 10 (глобальная переменная)
    return 0;
}

Статические локальные переменные

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

void countCalls() {
    static int count = 0; // инициализируется только один раз
    count++;
    std::cout << "Функция вызвана " << count << " раз(а)" << std::endl;
}

int main() {
    countCalls(); // выведет "Функция вызвана 1 раз(а)"
    countCalls(); // выведет "Функция вызвана 2 раз(а)"
    countCalls(); // выведет "Функция вызвана 3 раз(а)"
    return 0;
}

Заключение

Понимание области видимости переменных очень важно для правильного структурирования кода и избежания конфликтов имен. Правильное использование областей видимости помогает создавать более понятный и поддерживаемый код.

Перейти к следующему уроку →