logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

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

Существует четыре области видимости: локальная, функция, файл и класс.

Локальная: Имя, описанное в блоке ($$R.6.3), является локальным

в этом блоке и может использоваться только в нем и в блоках,

содержащихся в этом блоке и появляющихся после момента описания.

Имена формальных параметров рассматриваются, как если бы они были

описаны в самом объемлющем блоке этой функции.

Функция: Метки ($$R.6.1) можно использовать повсюду в функции,

в которой они описаны. Только метки имеют область видимости,

совпадающую с функцией.

Файл: Имя описанное вне всех блоков ($$R.6.3) и классов ($$R.9)

имеет область видимости файл и может быть использовано в единице

трансляции, в которой оно появляется после момента описания. Имена,

описанные с файловой областью видимости, называются глобальными.

Класс: Имя члена класса является локальным в своем классе и

оно может быть использовано только в функции-члене этого класса

($$R.9.3), или после операции . , применяемой к объекту данного

класса ($$R.5.2.4) или объекту производного класса($$R.10),

или после операции ->, применяемой к указателю на объект данного

класса ($$R.5.2.4) или на объект производного класса, или после

операции разрешения :: ($$R.5.1), примененной к имени данного

или производного класса. Имя, введенное с помощью операции

friend ($$R.11.4), принадлежит той же области определенности,

что и класс, содержащий описание friend. Класс, впервые

описанный в операторе return или в типе параметра, принадлежит

к глобальной области видимости.

Специальные соглашения действуют на имена, введенные при описании

параметров функции ($$R.8.2.5) и в описаниях friend ($$R.11.4).

Имя может быть скрыто явным описанием того же имени в объемлющем

блоке или классе. Скрытое имя члена класса все-таки можно

использовать, если оно предваряется именем класса, к которому

применена операция :: ($$R.4.1, $$R.9.4, $$R.10). Скрытое имя объекта,

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

можно использовать, если оно предваряется унарной операцией ::

($$R.5.1). В дополнении к этому, имя класса ($$R.9.1) может быть

скрыто именем объекта, функции или элемента перечисления, имеющего

ту же область видимости. Если класс и объект, или функция, или

элемент перечисления описаны (в любом порядке) с одинаковым именем

в одной области видимости, то имя класса становится скрытым. Имя

класса, скрытое в локальной области видимости или в области

видимости класса именем объекта, функции или элемента перечисления,

все-таки можно использовать, если предварить его подходящей

спецификацией class, struct или union ($$R.7.1.6). Аналогично,

скрытое имя элемента перечисления можно использовать, если

предварить его спецификацией типа enum ($$R.7.1.6). В $$R.10.4

приводится сводка правил области видимости.

Моментом описания имени считается момент завершения описателя имени

($$R.8), предшествующей части инициализации (если она есть).

Например,

int x = 12;

{ int x = x; }

Здесь второе x инициализируется своим собственным (неопределенным)

значением.

Моментом описания элемента перечисления считается момент сразу

после появления его идентификатора, например:

enum { x = x };

Здесь элемент перечисления x опять инициализируется своим собственным

(неопределенным) значением.