2.1.1 Область Видимости

2.1.1 Область Видимости

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

int x; // глобальное x

f() (* int x; // локальное x прячет глобальное x x = 1; // присвоить локальному x (* int x; // прячет первое локальное x x = 2; // присвоить второму локальному x *) x = 3; // присвоить первому локальному x *)

int* p = amp;x; // взять адрес глобального x

Сокрытие имен неизбежно при написании больших программ. Однако читающий человек легко может не заметить, что имя скрыто, и некоторые ошибки, возникающие вследствие этого,

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

С помощью применения операции разрешения области видимости :: можно использовать скрытое глобальное имя. Например:

int x;

f() (* int x = 1; // скрывает глобальное x ::x = 2; // присваивает глобальному x *)

Но возможности использовать скрытое локальное имя нет.

Область видимости имени начинается в точке описания. Это означает, что имя можно использовать даже для задания его собственного значения. Например:

int x;

f() (* int x = x; // извращение *)

Это не является недопустимым, хотя и бессмысленно, и компилятор предупредит, что x «used before set» («использовано до того, как задано»), если вы попробуете так сделать. Можно, напротив, не применяя операцию ::, использовать одно имя для ссылки на два различных объекта в блоке. Например:

int x;

f() // извращение (* int y = x; // глобальное x int x = 22; y = x; // локальное x *)

Переменная y инициализируется значением глобального x, 11, а затем ему присваивается значение локальной переменной x, 22.

Имена параметров функции считаются описанными в самом внешнем блоке функции, поэтому

f(int x) (* int x; // ошибка *)

содержит ошибку, так как x определено дважды в одной и той же области видимости.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

7. Изменение значений по умолчанию для типов, область видимости

Из книги автора

7. Изменение значений по умолчанию для типов, область видимости Пусть в новой программе почти все переменные являются целочисленными. Тогда удобно осуществлять их объявление так, чтобы переменная, для которой не указан тип, больше не объявлялась как variant. Для этого


R.3.2 Область видимости

Из книги автора

R.3.2 Область видимости Существует четыре области видимости: локальная, функция, файл и класс.Локальная: Имя, описанное в блоке (§R.6.3), является локальным в этом блоке и может использоваться только в нем и в блоках, содержащихся в этом блоке и появляющихся после момента


R.16.3.4 Область видимости макроимен и конструкция #undef

Из книги автора

R.16.3.4 Область видимости макроимен и конструкция #undef После появления макроопределения идентификатор из него считается определенным и остается в текущей области видимости (независимо от правил областей видимости в С++) до конца единицы трансляции или пока его определение


8. Область видимости и время жизни

Из книги автора

8. Область видимости и время жизни В этой главе обсуждаются два важных вопроса, касающиеся объявлений в С++. Где употребляется объявленное имя? Когда можно безопасно использовать объект или вызывать функцию, т.е. каково время жизни сущности в программе? Для ответа на


8.1. Область видимости

Из книги автора

8.1. Область видимости Каждое имя в С++ программе должно относиться к уникальной сущности (объекту, функции, типу или шаблону). Это не значит, что оно встречается только один раз во всей программе: его можно повторно использовать для обозначения другой сущности, если


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

Из книги автора

8.1.1. Локальная область видимости Локальная область видимости – это часть исходного текста программы, содержащаяся в определении функции (или блоке внутри тела функции). Все функции имеют свои локальные области видимости. Каждая составная инструкция (или блок) внутри


9.1.4. Перегрузка и область видимости A

Из книги автора

9.1.4. Перегрузка и область видимости A Все перегруженные функции объявляются в одной и той же области видимости. К примеру, локально объявленная функция не перегружает, а просто скрывает глобальную:#include stringvoid print( const string );void print( double ); // перегружает print()void fooBar( int ival ){//


Пример 19-1. Область видимости переменных

Из книги автора

Пример 19-1. Область видимости переменных #!/bin/bash# subshell.shechoouter_variable=Outer(inner_variable=Innerecho "Дочерний процесс, "inner_variable" = $inner_variable"echo "Дочерний процесс, "outer" = $outer_variable")echoif [ -z "$inner_variable" ]then echo "Переменная inner_variable не определена в родительской оболочке"else echo "Переменная inner_variable


Пример 22-8. Область видимости локальных переменных

Из книги автора

Пример 22-8. Область видимости локальных переменных #!/bin/bashfunc (){ local loc_var=23 # Объявление локальной переменной. echo echo ""loc_var" в функции = $loc_var" global_var=999 # Эта переменная не была объявлена локальной. echo ""global_var" в функции = $global_var"}func# Проверим, "видна" ли локальная переменная


Область видимости параметров

Из книги автора

Область видимости параметров Область видимости параметров определяется в точности так же, как область видимости переменных. Единственным, на что следует обратить здесь внимание — это то, что элементы xsl:param, определяемые в шаблонах, должны всегда быть его первыми


2.1.1 Область Видимости

Из книги автора

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


4.1 Область Видимости

Из книги автора

4.1 Область Видимости Есть четыре вида областей видимости: локальная, файл, программа и класс.Локальная: Имя, описанное в блоке (#9.2), локально в этом блоке и может использоваться только в нем после места описания и в охватываемых блоках. Исключение составляют метки (#9.12),