Выбрать главу

    if(n <= upperbound) count = n;

   }

   int run() {

    if(count > lowerbound) return count--;

    else return lowerbound;

   }

 };

}

int main()

{

 CounterNameSpace::upperbound = 100;

 CounterNameSpace::lowerbound = 0;

 CounterNameSpace::counter ob1(10);

 int i;

 do {

  i = ob1.run();

  cout << i << " ";

 }while(i > CounterNameSpace :: lowerbound);

 cout << endl;

 CounterNameSpace::counter ob2(20);

 do {

  i = ob2.run();

  cout << i << " ";

 }while(i > CounterNameSpace::lowerbound);

 cout << endl;

 ob2.reset(100);

 CounterNameSpace::lowerbound = 90;

 do {

  i = ob2.run();

  cout << i << " ";

 }while(i > CounterNameSpace::lowerbound);

 return 0;

}

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

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

namespace NS {

 int i;

}

 // . . .

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 <iostream>

using namespace std;