Области видимости переменных

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

  • Глобальные переменные — это переменные, объявленные в программе вне функций. Глобальные переменные видны в любой части программы, включая функции. Инициализация таких переменных производится только один раз. Если при объявлении переменной не было присвоено начальное значение, то производится автоматическая инициализация нулевым значением.
  • Локальные переменные — это переменные, которые объявлены внутри функции или блока (области, ограниченной фигурными скобками). Локальные переменные видны только внутри функции или блока. Инициализация таких переменных производится при каждом вызове функции или входе в блок. После выхода из функции или блока локальная переменная уничтожается. Если при объявлении переменной не было присвоено начальное значение, то переменная будет содержать произвольное значение, так называемый «мусор». Исключением являются статические локальные переменные, которым автоматически присваивается нулевое значение и которые сохраняют значение при выходе из функции.

Если имя локальной переменной совпадает с именем глобальной переменной, то все операции внутри функции осуществляются с локальной переменной, а значение глобальной не изменяется. Чтобы в этом случае получить доступ к глобальной переменной, необходимо перед названием переменной указать два двоеточия, например, ::x.

Область видимости глобальных и локальных переменных показана в листинге 3.4.

Листинг 3.4. Область видимости переменных

#include <iostream>

int x = 10;           // Глобальная переменная
void func();

int main() {
   func();
   // Вывод значения глобальной переменной x
   std::cout << x << std::endl;    // 10
   { // Блок
      int z = 30;
      std::cout << z << std::endl; // 30
   }
   // Переменная z здесь уже не видна!!!
   for (int i = 0; i < 10; ++i) {
      std::cout << i << std::endl;
   }
   // Переменная i здесь уже не видна!!!
   return 0;
}
void func() {
   int x = 5; // Локальная переменная
   // Вывод значения локальной переменной x
   std::cout << x << std::endl;   // 5
   // Вывод значения глобальной переменной x
   std::cout << ::x << std::endl; // 10
}

Очень важно учитывать, что переменная, объявленная внутри блока, видна только в пределах блока (внутри фигурных скобок). Например, присвоим значение переменной в зависимости от некоторого условия:

// Неправильно!!!
if (x == 10) { // Какое-то условие
   int y;
   y = 5;
}
else {
   int y;
   y = 25;
}
// Переменная y здесь не определена!!!

В этом примере переменная y видна только внутри блока. После условного оператора if переменной не существует. Чтобы переменная была видна внутри блока и после выхода из него, необходимо поместить объявление переменной перед блоком:

// Правильно
int y;
if (x == 10) { // Какое-то условие
   y = 5;
}
else {
   y = 25;
}
std::cout << y << std::endl;

Если обращение к переменной внутри функции или блока производится до объявления одноименной локальной переменной, то до объявления будет использоваться глобальная переменная, а после объявления — локальная переменная (листинг 3.5). Если глобальной переменной с таким названием не существует, то будет ошибка при компиляции.

Листинг 3.5. Обращение к переменной до объявления внутри функции

#include <iostream>

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

int main() {
   // Выводится значение глобальной переменной
   std::cout << x << std::endl; // 10
   int x = 5; // Локальная переменная
   // Выводится значение локальной переменной
   std::cout << x << std::endl; // 5
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов