Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

21.1.1. Поняття про простори імен

Ключове слово namespace дає змогу розділити глобальний простір імен шляхом створення певної декларативної області. По суті, простір імен визначає область видимості. Загальний формат задання простору імен є таким:

namespace name {

// Оголошення

}

Все, що визначено у межах настанови namespace, знаходиться в області видимості цього простору імен.

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

// Приклад використання namespace-настанови

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.

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

#include <vcl>

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

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

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

// Приклад використання namespace-настанови

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.

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