Выбрать главу
Понятие пространства имен

Ключевое слово namespace позволяет разделить глобальное пространство имен путем создания некоторой декларативной области. По сути, пространство имен определяет область видимости. Общий формат задания пространства имен таков.

namespace name {

 // объявления

}

Все, что определено в границах инструкции namespace, находится в области видимости этого пространства имен.

В следующей программе приведен пример использования namespace-инструкции. Она локализует имена, используемые для реализации простого класса счета в обратном направлении. В созданном здесь пространстве имен определяется класс counter, который реализует счетчик, и переменные upperbound и lowerbound, содержащие значения верхней и нижней границ, применяемых для всех счетчиков.

namespace CounterNameSpace {

 int upperbound;

 int lowerbound;

 class counter {

   int count;

  public:

   counter(int n) {

    if(n <= upperbound) count = n;

    else count = upperbound;

   }

   void reset(int n) {

    if(n <= upperbound) count = n;

   }

   int run() {

    if(count > lowerbound) return count--;

    else return lowerbound;

   }

 };

}

Здесь переменные upperbound и lowerbound, а также класс counter являются частью области видимости, определенной пространством имен CounterNameSpace.

В любом пространстве имен к идентификаторам, которые в нем объявлены, можно обращаться напрямую, т.е. без указания этого пространства имен. Например, в функции run(), которая находится в пространстве имен CounterNameSpace, можно напрямую обращаться к переменной lowerbound:

if(count > lowerbound) return count--;

Но поскольку инструкция namespace определяет область видимости, то при обращении к объектам, объявленным в пространстве имен, извне этого пространства необходимо использовать оператор разрешения области видимости. Например, чтобы присвоить значение 10 переменной upperbound из кода, который является внешним по отношению к пространству имен CounterNameSpace, нужно использовать такую инструкцию.

CounterNameSpace::upperbound = 10;

Чтобы объявить объект типа counter вне пространства имен CounterNameSpace, используйте инструкцию, подобную следующей.

CounterNameSpace::counter ob;

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

Рассмотрим программу, в которой демонстрируется использование пространства имен CounterNameSpace.

// Демонстрация использования пространства имен.

#include <iostream>

using namespace std;

namespace CounterNameSpace {

 int upperbound;

 int lowerbound;

 class counter {

   int count;

  public:

   counter (int n) {

    if(n <= upperbound) count = n;

    else count = upperbound;

   }

   void reset (int n) {