Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При объявлении элемента программы, например класса, функции или переменной, его имя может быть "видно" и использоваться в определенных частях программы. Контекст, в котором отображается имя, называется его областью. Например, если вы объявляете переменную x
в функции, x
она отображается только в этом теле функции. Она имеет локальную область. В программе могут быть другие переменные с тем же именем; Если они находятся в разных областях, они не нарушают правило одного определения и не возникает никаких ошибок.
Для автоматических нестатических переменных область также определяет, когда они создаются и уничтожаются в памяти программы.
Существует шесть типов областей:
Глобальная область — это имя, объявленное за пределами любого класса, функции или пространства имен. Однако в C++ даже эти имена существуют с неявным глобальным пространством имен. Область глобальных имен простирается от точки объявления до конца файла, в котором они объявлены. Для глобальных имен видимость также регулируется правилами компоновки, определяющими, отображается ли имя в других файлах программы.
Область пространства имен— имя, объявленное в пространстве имен, за пределами любого класса или блока перечисления или блока функций, отображается с точки объявления до конца пространства имен. Пространство имен может быть определено в нескольких блоках в разных файлах.
Имя локальной области , объявленное в функции или лямбда-коде, включая имена параметров, имеет локальную область. Они часто называются "местными жителями". Они видны только с точки объявления до конца функции или лямбда-тела. Локальная область — это область блока, которая рассматривается далее в этой статье.
Имена областей классов членов класса имеют область класса, которая расширяется в определении класса независимо от точки объявления. Специальные возможности членов класса контролируются
public
ключевыми словами иprivate
protected
ключевыми словами. Доступ к общедоступным или защищенным членам можно получить только с помощью операторов выбора элементов (или ->) или операторов указателя на члены (*или -).>*Имена областей инструкций, объявленные в операторе
for
,if
while
отображаютсяswitch
до конца блока инструкций.Метка области функций имеет область функции, что означает, что она видна на протяжении всего тела функции даже до точки объявления. Область функции позволяет записывать инструкции, как
goto cleanup
и доcleanup
объявления метки.
Скрытие имен
Можно скрыть имя, объявив его в закрытом блоке. На следующем рисунке i
повторно объявляется во внутреннем блоке, таким образом скрывая переменную, связанную с i
во внешней области видимости блока.
Блокировка области и скрытие имен
Выходные данные программы, представленной на рисунке, выглядят следующим образом.
i = 0
i = 7
j = 9
i = 0
Примечание.
Считается, что аргумент szWhat
, находится в области видимости функции. Поэтому он обрабатывается так, как если бы он был объявлен в крайнем блоке функции.
Скрытие имен классов
Имена классов можно скрыть, объявив функцию, объект, переменную или перечислитель в той же области. Однако имя класса по-прежнему можно получить при префиксе ключевого слова class
.
// hiding_class_names.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
// Declare class Account at global scope.
class Account
{
public:
Account( double InitialBalance )
{ balance = InitialBalance; }
double GetBalance()
{ return balance; }
private:
double balance;
};
double Account = 15.37; // Hides class name Account
int main()
{
class Account Checking( Account ); // Qualifies Account as
// class name
cout << "Opening account with a balance of: "
<< Checking.GetBalance() << "\n";
}
//Output: Opening account with a balance of: 15.37
Примечание.
Любое место, где вызывается имя класса (Account
), класс ключевых слов должен использоваться для отличия его от глобальной переменной Account. Это правило не применяется, если имя класса находится слева от оператора разрешения области действия (::). Имена слева от оператора разрешения области действия всегда считаются именами класса.
В следующем примере показано, как объявить указатель на объект типа Account
с помощью class
ключевого слова:
class Account *Checking = new class Account( Account );
В Account
инициализаторе (в скобках) в приведенной выше инструкции имеется глобальная область; она имеет тип double
.
Примечание.
Повторное использование имен идентификаторов считается плохим стилем программирования, как показано в следующем примере.
Сведения о объявлении и инициализации объектов класса см. в разделе "Классы", "Структуры" и "Объединения". Сведения об использовании new
операторов и delete
бесплатных хранилищ см. в новых и удаленных операторах.
Скрытие имен с глобальной областью
Вы можете скрыть имена с глобальной областью, явно объявив то же имя в области блока. Однако к именам глобальной области можно получить доступ с помощью оператора разрешения области (::
).
#include <iostream>
int i = 7; // i has global scope, outside all blocks
using namespace std;
int main( int argc, char *argv[] ) {
int i = 5; // i has block scope, hides i at global scope
cout << "Block-scoped i has the value: " << i << "\n";
cout << "Global-scoped i has the value: " << ::i << "\n";
}
Block-scoped i has the value: 5
Global-scoped i has the value: 7