Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

9.5 Фізичне розділення простору імен

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

Ця властивість "склеювання" простору імен добре підходить для організації бібліотеки. Аналогічно класам, початковий код розділяється на дві частини: інтерфейс та реалізацію. Інтерфейсна частина поміщається в окремий заголовний файл, а реалізація – в інший файл. У клієнтському коді підключається тільки заголовний файл.

Приклад:

/* vector.h */

namespace vector

{

const double pi = 3.141615926;

class vector {/*...*/};

vector operator+(const vector &vl, const vector &v2);

double scalar_product(const vector&vl, const vector&v2);

double length(const vector &v);

}

/* vector.cpp */

#include "vector.h"

namespace vector

{ // реалізація методів класу vector

vector operator+(const vector &vl, const vector &v2)

{/*...*/}

double scalar_product (const vector&v1,const vector &v2)

{/*...*/}

double length(const vector &v)

{/*...*/}

}

/* user.cpp. клієнтський код */

#include "vector.h"

// ...

void F(vector::vector &v)

{ // ...

double d = vector::length(v);

//...

}

Така організація простору імен аналогічна розділенню класу на інтерфейс та реалізацію.

9.6 Міжмодульні змінні та функції

Кожне ім'я, що позначає об'єкт, має деяку зону видимості (дії), в якій це ім'я оголошене і може використовуватися. У стандарті C++ визначені наступні зони видимості: оператор, прототип, блок, функція, клас, файл, простір імен. Імена в одній зоні видимості не мають бути однакові, але в різних областях вони можуть і збігатися. Імена, оголошені поза всіма зонами видимості, входять в глобальний простір імен. Так, всі імена Windows API входять в глобальний простір імен. Для звернення до глобального імені використовується операція дозволу контексту ::, оскільки за умовчанням (без вказівки кваліфікаторів) завжди вибирається ім'я з "найменшою" зоною видимості.

Відповідно до правила одного визначення (one-definition rule – ODR), одиниця трансляції не повинна містити більш за одне визначення будь-якої змінної, функції, класу, перерахування і шаблону. Оголошень може бути декілька: оголошення додають деяке ім'я в дану зону видимості і використовуються для узгодження типів. Змінна, визначена у файлі поза всіма класами і функціями, називається глобальною. У іншому модулі-файлі вона має бути оголошена з ключовим словом extern.

// Модуль з визначенням змінної

int Global = 1;

// Модуль з оголошенням змінної

extern int Global;

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

// файл з оголошенням функції

void f(void)

{ cout << "f()" << endl; }

// будь-який інший файл з прототипом функції

void f(void);

Слово extern писати не потрібно, хоча і не забороняється. Прототипи

void f(void);

extern void f(void);

є еквівалентними.