Области действия идентификаторов в C++
Каждый программный объект имеет область действия, которая определяется видом и местом его объявления. Существуют следующие области действия: блок, файл, функция, прототип функции, класс и поименованная область.
Блок
Идентификаторы, описанные внутри блока, являются локальными. Область действия идентификатора начинается в точке определения и заканчивается в конце блока, видимость — в пределах блока и внутренних блоков, время жизни — до выхода из блока. После выхода из блока память освобождается.
Файл
Идентификаторы, описанные вне любого блока, функции, класса или пространства имен, имеют глобальную видимость и постоянное время жизни и могут использоваться с момента их определения.
Функция
Единственными идентификаторами, имеющими такую область действия, являются метки операторов. В одной функции все метки должны различаться, но могут совпадать с метками других функций.
Прототип функции
Идентификаторы, указанные в списке параметров прототипа (объявления) функции, имеют областью действия только прототип функции.
Класс
Элементы структур, объединений и классов (за исключением статических элементов) являются видимыми лишь в пределах класса. Они образуются при создании переменной указанного типа и разрушаются при ее уничтожении.
Поименованная область
C++ позволяет явным образом задать область определения имен как часть глобальной области с помощью оператора namespace. Область видимости совпадает с областью действия за исключением ситуации, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимости. Способ обратиться к скрытой локальной переменной отсутствует. В каждой области действия различают пространства имен.
Пространство имен — область, в пределах которой идентификатор должен быть уникальным.
В разных пространствах имена могут совпадать, поскольку разрешение ссы-лок осуществляется по контексту идентификатора в программе.
Пример:
Здесь противоречия нет, так как имена типа, переменной и элемента структуры относятся к разным пространствам.
В C++ определено четыре раздельных класса идентификаторов, в пределах каждого из которых имена должны быть уникальными: • К одному пространству имен относятся имена переменных, функций, типов, определенных пользователем (typedef) и констант перечислений в пределах одной области видимости. Все они, кроме имен функций, могут быть пере-определены во вложенных блоках.
• Другой класс имен образуют имена типов перечислений, структур, классов и объединений. Каждое имя должно отличаться от имен других типов в той же области видимости.
• Отдельный класс составляют элементы каждой структуры, класса и объединения. Имя элемента должно быть уникально внутри структуры, но может совпадать с именами элементов других структур.
• Метки образуют отдельное пространство имен.
Блок
Идентификаторы, описанные внутри блока, являются локальными. Область действия идентификатора начинается в точке определения и заканчивается в конце блока, видимость — в пределах блока и внутренних блоков, время жизни — до выхода из блока. После выхода из блока память освобождается.
Файл
Идентификаторы, описанные вне любого блока, функции, класса или пространства имен, имеют глобальную видимость и постоянное время жизни и могут использоваться с момента их определения.
Функция
Единственными идентификаторами, имеющими такую область действия, являются метки операторов. В одной функции все метки должны различаться, но могут совпадать с метками других функций.
Прототип функции
Идентификаторы, указанные в списке параметров прототипа (объявления) функции, имеют областью действия только прототип функции.
Класс
Элементы структур, объединений и классов (за исключением статических элементов) являются видимыми лишь в пределах класса. Они образуются при создании переменной указанного типа и разрушаются при ее уничтожении.
Поименованная область
C++ позволяет явным образом задать область определения имен как часть глобальной области с помощью оператора namespace. Область видимости совпадает с областью действия за исключением ситуации, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимости. Способ обратиться к скрытой локальной переменной отсутствует. В каждой области действия различают пространства имен.
Пространство имен — область, в пределах которой идентификатор должен быть уникальным.
В разных пространствах имена могут совпадать, поскольку разрешение ссы-лок осуществляется по контексту идентификатора в программе.
Пример:
struct Node{ int Node; int 1; }Node;
В C++ определено четыре раздельных класса идентификаторов, в пределах каждого из которых имена должны быть уникальными: • К одному пространству имен относятся имена переменных, функций, типов, определенных пользователем (typedef) и констант перечислений в пределах одной области видимости. Все они, кроме имен функций, могут быть пере-определены во вложенных блоках.
• Другой класс имен образуют имена типов перечислений, структур, классов и объединений. Каждое имя должно отличаться от имен других типов в той же области видимости.
• Отдельный класс составляют элементы каждой структуры, класса и объединения. Имя элемента должно быть уникально внутри структуры, но может совпадать с именами элементов других структур.
• Метки образуют отдельное пространство имен.