Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

Інкапсуляція. Керування доступом до членів класу

Клас включає як дані, так і функції (код). Доступом до елементів класу можна керувати. Це керування стосується не тільки даних, але і коду.

Щоб використовувати клас необхідно знати, які функції і які дані доступні. Набір доступних функцій і даних називається користувальницьким інтерфейсом класу.

Головна турбота при створенні класу - сховати якнайбільше інформації. Це накладає обмеження на використання даних чи коду усередині класу. Існує три види користувачів класу:

  • сам клас (функції-члени мають прямий доступ до членів класу);

  • звичайні користувачі (доступ з функції main( ) і інших функцій);

  • похідні класи (доступ із класів-спадкоємців до членів базових класів).

Кожен вид користувачів має різні привілеї доступу до членів (елементів) класу. Кожен рівень привілеїв доступу асоціюється з визначеним ключовим словом. Рівнів привілеїв доступу в С++ всього три, вони визначаються наступними ключовими словами:

  • private – закриті (приватні) члени класу;

  • protected – захищені члени класу;

  • public відкриті члени класу.

Елемент класу (class), розташований в розділі private, може використовуватися тільки функціями-членами і "друзями" класу, у якому вони оголошені. Елемент, розташований в розділі protected, може використовуватися як і private, але крім того, елемент може бути використаний функціями-членами і функціями-«друзями» класів, похідних від оголошеного класу. Елемент, розташований в розділі public, може використовуватися будь-якою функцією й операторами програми.

Елементи класу за умовчанням мають атрибут private, тому специфікатори доступу public і protected повинні задаватися явно.

Елементи структури (struct) за умовчанням мають атрибут public, але можно перевизначити доступ за допомогою специфікаторів доступу private чи protected.

Елементи union за умовчанням мають атрибут publiс. Перевизначити його не можна. Задавати специфікатори доступу для елементів об'єднання неприпустимо.

Модифікатор доступу (за умовчанням чи заданий) залишається дійсним для всіх наступних оголошень елементів, поки не зустрінеться інший модифікатор доступу.

Приклади:

class X {

int i; // X::i за умовчанням privаte

char ch; // X::ch аналогічно Х::i

public:

int j; // Дані-члени j, k

int k; // відкриті - public

protected:

int l; // X::l - protected

};

struct Y {

int i; // Y::i за умовчанням public

private:

int j; // Y::j – private (приватний)

public:

int k; // Y::k - public

};

union Z {

int i; // public за умовчанням,

double d; // інших варіантів немає

};

Специфікатори доступу можуть повторюватися в будь-якій зручній послідовності.

Приклад

class AccessCtrlEx {

int value1; // Приватні члени-класу за умовчанням, доступні

void fun1(long); // тільки функціям – членам класу

private:

int value2; // Теж приватні, доступні тільки

int fun2(char *); // функціям-членам класу

public:

char* value3; // Загальнодоступні члени класу

long fun3(void);

protected:

int value4; // Захищені члени, доступні тільки функціям – членам

void fun4 (long); // класу і класів-спадкоємців (похідних класів)

};

Найбільш обмежений доступ до приватних (private) членів класу. Тільки сам клас чи класи, оголошені як дружні (friend) мають доступ до приватних членів. Похідні класи не мають доступу до приватних членів батьківського класу. Концепція приховання інформації реалізована в мові тільки частково, щоб запобігти ненавмисному доступу до внутрішніх перемінних чи функцій класу, оскільки навмисний доступ можна завжди одержати до будь-якої частини класу в обхід звичайних способів.

Для того, щоб використовувати загальнодоступні члени класу усередині функції, необхідно мати доступ до об’єктів цих класів. Щоб зробити члени загальнодоступними, їх потрібно оголосити в секції public класу.

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

Класи пам'яті для об'єктів

Клас, у змісті розподілу пам'яті, розглядається як вид структури. Як і структури, класи можуть бути оголошені з такими класами пам'яті, як автоматичний (auto), зовнішній (extern) або статичний (static).

Перемінні (ідентифікатори), оголошені усередині класу, можна використовувати тільки в сполученні з об'єктами класу. При неоднозначному тлумаченні звертання до елементів об'єкту повинний використовуватися оператор дозволу області видимості (::).