double arrow

Правила, определяющие область видимости

Области видимости переменных и функций

Область видимости или область действия переменной или функции — это

часть программы, в которой на нее можно ссылаться. При решении вопросов види-

мости важнейшее значение имеет понятие блока. Блок — это фрагмент кода, огра-

ниченный фигурными скобками "{ }".

Существуют четыре области действия идентификатора переменной или функ-

ции — область действия функция, область действия файл, область действия

блок и область действия прототип функции.

Идентификатор, объявленный вне любой функции (на внешнем уровне), имеет

область действия файл. Такой идентификатор «известен» всем функциям от точ-

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

зываются глобальными. Глобальные переменные, описания функций и прототипы

функций, находящиеся вне функции — все они имеют областью действия файл.

Метки (идентификаторы с последующим двоеточием, например, 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.


Сейчас читают про: