Справочные данные по языку C++___________________________619

Существует два типа переменных статического класса памяти: глобальные пе-
ременные и локальные переменные, объявленные спецификацией класса памяти
static. Глобальные переменные по умолчанию относятся к классу памяти extern.
Глобальные переменные создаются путем размещения их объявлений вне описа-
ния какой-либо функции и сохраняют свои значения в течение всего времени вы-
полнения программы. На глобальные переменные может ссылаться любая функ-
ция, которая расположена после их объявления или описания в файле.

Хороший стиль программирования

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

Локальные переменные, объявленные с ключевым словом static, известны то-
лько в том блоке, в котором они определены. Но в отличие от автоматических пе-
ременных, локальные переменные static сохраняют свои значения в течение всего
-времени выполнения программы. При каждом следующем обращении к этому бло-
ку локальные переменные содержат те значения, которые они имели при предыду-
щем обращении.

Вернемся к уже рассмотренному выше примеру, но укажем для переменной i
статический класс:

(
static int i = 1;

i++;

Инициализация переменной i произойдет только один раз за время выполне-
ния программы. При первом обращении к этому блоку значение переменной i бу-
дет равно 1. К концу выполнения блока ее значение станет равно 2. При следую-
щем обращении к блоку это значение сохранится и при окончании повторного вы-
полнения блока i будет равно 3. Таким образом, статическая переменная способна
хранить информацию между обращениями к блоку и, следовательно, может испо-
льзоваться, например, как счетчик числа обращений.

Все числовые переменные статического класса памяти принимают нулевые
начальные значения, если программист явно не указал другие начальные значе-
ния. Статические переменные — указатели, тоже имеют нулевые начальные зна-
чения.

Спецификации класса памяти extern используется,в программах с нескольки-
ми файлами. Пусть, например, в модуле Uniti в файле Unitl.cpp или Unitl.h (это
безразлично) объявлена глобальная переменная

int a = 5;

Тогда, если в другом модуле Unit2 в файле Unit2.cpp или Unit2.h объявлена
глобальная переменная

extern int а;

то компилятор понимает, что речь идет об одной и той же переменной. И оба моду-
ля могут с ней работать. Для этого даже нет необходимости связывать эти модули
директивой #include (см. раздел 11.2.1), включающей в модуль Uniti заголовоч-
ный файл второго модуля.

Подробнее области видимости переменных рассмотрены в разделе 11.6.