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

{

CounterNameSpace::upperbound = 100;

CounterNameSpace::lowerbound = 0;

 

CounterNameSpace::counter A_ob(10);

CounterNameSpace::counter B_ob(20);

int izm;

 

cout << "Розрахунок у зворотному порядку для об'єкта A_ob" << "\n";

do {

izm = A_ob.run();

cout << izm << " ";

} while(izm > CounterNameSpace::lowerbound);

cout << endl;

 

cout << "Розрахунок у зворотному порядку для об'єкта B_ob" << "\n";

do {

izm = B_ob.run();

cout << izm << " ";

} while(izm > CounterNameSpace::lowerbound);

cout << endl;

 

B_ob.reset(100);

CounterNameSpace::lowerbound = 80;

 

cout << "Розрахунок у зворотному порядку для об'єкта B_ob" << "\n";

do {

izm = B_ob.run();

cout << izm << " ";

} while(izm > CounterNameSpace::lowerbound);

cout << endl;

 

getch(); return 0;

}

Звернемо Вашу увагу на те, що під час створення об'єкта класу counter і при зверненні до змінних upperbound і lowerbound використовують ім'я простору імен CounterNameSpace. Але після створення об'єкта типу counter вже немає потреби у повній кваліфікації його самого або його членів. Оскільки простір імен однозначно визначено, то функцію run() об'єкта A_ob можна викликати безпосередньо, тобто без вказання (як префікс) простору імен (A_ob.run()).

Програма може містити декілька оголошень просторів імен з однаковими іменами. Це означає, що простір імен можна поділити на декілька файлів або на декілька частин у рамках одного файлу. Зробити це можна так:

namespace NS {

int izm;

}

 

//....

namespace NS {

int jzm;

}

У цьому записі простір імен NS розділено на дві частини. Проте вміст кожної частини належить до одного і того ж простору імен NS.

Будь-який простір імен повинен бути оголошений поза всіма іншими областями видимості. Це означає, що не можна оголошувати простори імен, які локалізовані, наприклад, у межах функції. При цьому один простір імен може бути вкладено в інший.

21.1.2. Застосування настанови using

Якщо програма містить багато посилань на члени певного простору імен, то неважко уявити, що потреба вказувати ім'я цього простору імен під час кожного зверненні до них, дуже скоро набридне Вам. Цю проблему дає змогу| вирішити настанова using, яка застосовується у таких двох форматах:

using namespace ім'я;

using name::член;

Настанова using робить заданий простір імен "видимим", тобто діючим.

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

using CounterNameSpace::lowerbound; // Видимим став тільки

// член lowerbound.

lowerbound = 10; // Все гаразд, оскільки член lowerbound знаходиться

// в області видимості.

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

upperbound = 100; // Все гаразд, оскільки всі члени видимі.

Використання настанови using продемонстровано у наведеному нижче коді програми (яка є новим варіантом лічильника з попереднього розділу).

Код програми 21.2. Демонстрація механізму використання настанови using для виконання розрахунку у зворотному порядку

#include <vcl>

#include <iostream>// Для потокового введення-виведення

#include <conio>// Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен