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


Область (C++)

При объявлении элемента программы, например класса, функции или переменной, его имя может быть "видно" и использоваться в определенных частях программы. Контекст, в котором отображается имя, называется его областью. Например, если вы объявляете переменную x в функции, x она отображается только в этом теле функции. Она имеет локальную область. В программе могут быть другие переменные с тем же именем; Если они находятся в разных областях, они не нарушают правило одного определения и не возникает никаких ошибок.

Для автоматических нестатических переменных область также определяет, когда они создаются и уничтожаются в памяти программы.

Существует шесть типов областей:

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

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

  • Имя локальной области , объявленное в функции или лямбда-коде, включая имена параметров, имеет локальную область. Они часто называются "местными жителями". Они видны только с точки объявления до конца функции или лямбда-тела. Локальная область — это область блока, которая рассматривается далее в этой статье.

  • Имена областей классов членов класса имеют область класса, которая расширяется в определении класса независимо от точки объявления. Специальные возможности членов класса контролируются publicключевыми словами и privateprotected ключевыми словами. Доступ к общедоступным или защищенным членам можно получить только с помощью операторов выбора элементов (или ->) или операторов указателя на члены (*или -).>*

  • Имена областей инструкций, объявленные в операторе for, ifwhileотображаются 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

См. также

Основные понятия