// . . .

namespace NS {

 int j;

}

Здесь пространство имен NS разделено на две части. Однако содержимое каждой части относится к одному и тому же пространству имен NS.

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

Инструкция using

Инструкция using делает заданное пространство имен "видимым", т.е. действующим.

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

using namespace имя;

using name::член;

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

using CounterNameSpace::lowerbound; /* Видимым стал только член lowerbound */

lowerbound = 10; /* Все в порядке, поскольку член lowerbound находится в области видимости. */

using namespace CounterNameSpace; // Все члены видимы.

upperbound = 100; // Все в порядке, поскольку все члены видимы.

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

// Использование инструкции using.

#include

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) {

    if(n <= upperbound) count = n;

   }

   int run() {

    if(count > lowerbound) return count--;

    else return lowerbound;

   }

 };

}

int main()

{

 /* Используется только член upperbound из пространства имен CounterNameSpace. */

 using CounterNameSpace::upperbound;

 /* Теперь для установки значения переменной upperbound не нужно указывать пространство имен. */

 upperbound = 100;

 /* Но при обращении к переменной lowerbound и другим объектам по-прежнему необходимо указывать пространство имен. */

 CounterNameSpace::lowerbound = 0;

 CounterNameSpace::counter ob1(10);

 int i;

 do {

  i = ob1.run();

  cout << i << " ";

 }while(i > CounterNameSpace::lowerbound);

 cout. << endl;

 /* Теперь используем все пространство имен CounterNameSpace. */

 using namespace CounterNameSpace;

 counter ob2(20);

 do {

  i = ob2.run();

  cout << i << " ";

 }while(i > lowerbound);

 cout << endl;

 ob2.reset(100);

 lowerbound = 90;

 do {

  i = ob2.run();

  cout << i << " ";

 }while(i > lowerbound);

 return 0;

}

Эта программа иллюстрирует еще один важный момент. Использование одного пространства имен не переопределяет другое. Если некоторое пространство имен становится "видимым", это значит, что оно просто добавляет свои имена к именам других, уже действующих пространств. Поэтому к концу этой программы к глобальному пространству имен добавились и std, и CounterNameSpace.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги