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

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

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

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

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

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

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

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

  • Оператор область Имена, объявленные в forоператоре , ifwhileили switch операторе, отображаются до конца блока инструкций.

  • Функция область Метка имеет функцию область, что означает, что она отображается в теле функции даже до точки объявления. Функция область позволяет создавать инструкции, как goto cleanup и до cleanup объявления метки.

Скрытие имен

Можно скрыть имя, объявив его в закрытом блоке. На следующем рисунке i повторно объявляется во внутреннем блоке, таким образом скрывая переменную, связанную с i во внешней области видимости блока.

Diagram that shows block scope name hiding.
Блокировка область и скрытие имен

Выходные данные программы, представленной на рисунке, выглядят следующим образом.

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

См. также

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