Поделиться через


Общие сведения о правилах области

Использование имени должно быть однозначно в пределах его области видимости (до той точки, в которой задана перезагрузка). Если имя обозначает функцию, то она должна быть однозначной с точки зрения количества и типа параметров. Если имя остается однозначным, применяются правила доступа к членам.

Инициализаторы конструктора

Инициализаторы конструкторов оцениваются в область самого внешнего блока конструктора, для которого они указаны. Следовательно, они могут использовать имена параметров конструктора.

Глобальные имена

Имя объекта, функции или перечислителя является глобальным, если оно объявлено вне любых функций или классов либо в качестве префикса указан глобальный унарный оператор области действия (::) и это имя не используется в сочетании с любым из следующих бинарных операторов:

  • Разрешение области (::)

  • Выделение элементов для объектов и ссылок (.)

  • Выбор элемента для указателей (->)

Полные имена

Имена, используемые с двоичным оператором разрешения область (::) называются "квалифицированными именами". Имя, указанное после оператора двоичного область разрешения, должно быть членом класса, указанного слева от оператора или члена базового класса.

Имена, указанные после оператора выбора члена (или ->), должны быть членами типа класса объекта, указанного слева от оператора или членов его базового класса( es). Имена, указанные справа от оператора выбора элементов (>-), также могут быть объектами другого типа класса, если левая сторона -> это объект класса, и что класс определяет перегруженный оператор выбора элементов (->), который вычисляет указатель на какой-то другой тип класса. (Эта подготовка подробно рассматривается в Доступ к члену класса.)

Компилятор осуществляет поиск имен в указанном ниже порядке. При обнаружении искомого имени поиск останавливается.

  1. Поиск в текущей области видимости блока, если имя используется внутри функции; в противном случае поиск выполняется в глобальной области.

  2. Поиск за пределами каждой включающей области видимости блока, в том числе во внешней области видимости функции (которая содержит параметры функции).

  3. Если имя используется в функции-члене, оно ищется в области видимости класса.

  4. Поиск имени выполняется в базовых классах класса.

  5. Поиск во включающей области видимости вложенного класса (если она имеется) и ее базах. Он продолжается до тех пор, пока не будет просмотрена внешняя включающая область видимости класса.

  6. Поиск в глобальной области.

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

  1. Если именам предшествует оператор ::, поиск начинается в глобальной области.

  2. Имена, classпредшествующие имени , structи union ключевое слово принудительно запрашивают компилятор только classимена или structunion имена.

  3. Имена в левой части оператора область разрешения (::) могут быть только class, или structnamespaceunion именами.

Если имя относится к нестатическому члену, но используется в статической функции-члене, выдается сообщение об ошибке. Аналогичным образом, если имя относится к любому нестатическому члену в заключенном классе, создается сообщение об ошибке, так как вложенные классы не имеют указателей класса включаемых this .

Имена параметров функции

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

Имена параметров функций в объявлениях функций (прототипах) находятся в локальной области видимости объявления и выходят из области видимости в конце объявления.

Параметры, имеющие значения по умолчанию, находятся в области видимости параметра, для которого они являются параметрами по умолчанию, как описано в предыдущих двух параграфах. Однако они не могут получить доступ к локальным переменным или нестатическим членам класса. Параметры, имеющие значения по умолчанию, вычисляются в точке вызова функции, но в исходной области видимости объявления функции. Поэтому параметры, имеющие значения по умолчанию, для функций-членов всегда вычисляются в области видимости класса.

См. также

Наследование