Области видимости переменных и функций
Область видимости или область действия переменной или функции — это
часть программы, в которой на нее можно ссылаться. При решении вопросов види-
мости важнейшее значение имеет понятие блока. Блок — это фрагмент кода, огра-
ниченный фигурными скобками "{ }".
Существуют четыре области действия идентификатора переменной или функ-
ции — область действия функция, область действия файл, область действия
блок и область действия прототип функции.
Идентификатор, объявленный вне любой функции (на внешнем уровне), имеет
область действия файл. Такой идентификатор «известен» всем функциям от точ-
ки его объявления до конца файла. Переменные, объявленные таким способом, на-
зываются глобальными. Глобальные переменные, описания функций и прототипы
функций, находящиеся вне функции — все они имеют областью действия файл.
Метки (идентификаторы с последующим двоеточием, например, start:) -
единственные идентификаторы, имеющие областью действия функцию. Метки
|
|
можно использовать всюду в функции, в которой они появились, но на них нельзя
ссылаться вне тела функции. Метки используются в структурах switch (как метки
case) и в операторах goto (см. разд. 1.10.1.2 и 1.10.1.3). Метки относятся к тем де-
талям реализации, которые функции «прячут» друг от друга. Это скрытие — один
из наиболее фундаментальных принципов разработки хорошего программного
обеспечения.
Идентификаторы, объявленные внутри блока (на внутреннем уровне), имеют
областью действия блок. Область действия блок начинается объявлением иденти-
Справочные данные по языку C++ 61
фикатора и заканчивается конечной правой фигурной скобкой блока. Если имеют-
ся вложенные блоки, то переменная внешнего блока видна и во вложенных бло-
ках.
Локальные переменные, объявленные в начале функции, имеют областью дей-
ствия блок так же, как и параметры функции, являющиеся локальными перемен-
ными.
Любой блок может содержать объявления переменных. Если блоки вложены
и идентификатор во внешнем блоке или идентификатор глобальной переменной
идентичен идентификатору во внутреннем блоке, одноименный идентификатор
внешнего блока или глобальный «невидим» (скрыт) до момента завершения рабо-
ты внутреннего блока. Это означает, что пока выполняется внутренний блок, он
видит значение своих собственных локальных идентификаторов, а не значения
идентификаторов с идентичными именами в охватывающем блоке.
Например:
int i = 1, k = 4 // объявление глобальных переменных
{
int i = 5, j = 2; // объявление переменных внешнего блока
... // видны переменные j, k
|
|
// и переменная i этого блока
{
int i = 7; // объявление переменной i внутреннего блока
... // видны переменные j, k
// и переменная i внутренняя
}
... // видны переменные j, k
// и переменная i внешнего блока
}
Локальная переменная не только видима в пределах блока, в котором она объ-
явлена. Ее время жизни тоже определяется временем выполнения блока. Перемен-
ная создается в момент входа в блок и разрушается в тот момент, когда управление
выходит за пределы блока. Таким образом, подобная переменная не может сохра-
нять какие-то значения в промежутках между выполнением операторов блока.
В приведенном выше примере переменная i во внутреннем блоке будет создаваться
каждый раз, когда управление передается в этот блок, ей каждый раз будет при-
сваиваться значение 7, и она каждый раз будет разрушаться при выходе из блока.
Сказанное выше о времени жизни относится к так называемым автоматиче-
ским (auto) переменным и не относится к статическим переменным, объявленным
как static. Например:
static int i = 7;
Такие статические переменные существуют все время работы программы
и инициализируются только один раз. Таким образом, в этих переменных можно
накапливать какую-то информацию. Например, они могут служить счетчиками
числа обращений к блоку (см. соответствующий пример в разд. 1.6.2). Но областью
действия таких переменных является только блок, в котором они объявлены.
Из внутреннего блока можно получить доступ к одноименной глобальной пе-
ременной с помощью унарной операции разрешения области действия "::". Напри-
мер, выражение::1 означает глобальную переменную I, даже если в данном блоке
объявлена локальная переменная I. В приведенном ранее примере с вложенными
блоками можно, например, записать во внутреннем блоке оператор
i =:: i + 1;
Этот оператор присвоит внутренней переменной i значение на единицу боль-
шее значения глобальной переменной i.