C++. Модифікатори доступу private, protected, public. Інкапсуляція даних в класі
Зміст
- 1. Випадки застосування модифікаторів доступу private, protected, public
- 2. Застосування модифікаторів доступу для елементів класу
- Зв’язані теми
Пошук на інших ресурсах:
1. Випадки застосування модифікаторів доступу private, protected, public
Парадигма об’єктно-орієнтованого програмування передбачає можливість задавання рівня доступності елементів класів. Рівень доступності дозволяє регулювати доступ до даних та методів класу. Одні елементи класу можуть бути загальнодоступні, інші – приховані. Приховування даних та методів у класі називається інкапсуляцією.
У мові C++ рівень доступності визначається з допомогою спеціальних модифікаторів private, protected, public. Застосування цих модифікаторів може бути використане у двох випадках:
- у випадку оголошення елементів класу. Цей випадок висвітлюється у даній темі;
- у випадку успадкування класів. Більш детально про застосування модифікаторів доступу при успадкуванні класів можна переглянути тут.
⇑
2. Застосування модифікаторів доступу для елементів класу
2.1. Модифікатор доступу private. Особливості застосування
Якщо у класі оголошується елемент (функція, член даних) у розділі private, то для нього діють наступні правила доступу:
- елемент недоступний будь-яким екземплярам методів інших класів або методів, що не є “дружніми” (рисунок 1) до класу;
- елемент недоступний з успадкованих класів (рисунок 2);
- елемент доступний з методів, які реалізовані у класі (рисунок 3);
- елемент доступний з дружніх функцій до класу (рисунок 4);
- елемент доступний з методів дружніх класів (рисунок 5).
Рисунок 1. Модифікатор доступу private. Немає доступу з екземпляру класу до private-елементу класу value
Рисунок 2. Модифікатор доступу private. Немає доступу до private-елементу класу з успадкованого класу
Рисунок 3. Модифікатор доступу private. Доступ до елементу класу з внутрішнього методу класу
Рисунок 4. Модифікатор доступу private. Доступ до елементу класу з дружньої функції (методу)
Якщо в коді, зображеному на рисунку 4, в оголошенні класу A перед іменем функції SetValue() забрати ключове слово friend, то доступу до змінної value класу не буде. Як результат, у функції SetValue() в рядку
objA.value = 33;
компілятор буде видавати помилку на кшталт
Member A::value is inaccessible
Рисунок 5. Модифікатор доступу private. Доступ до private-елементу класу з методу дружнього класу
⇑
2.2. Модифікатор доступу public. Особливості застосування
Якщо в класі оголошено елемент з модифікатором доступу public, у цьому випадку справедливе наступне правило:
- елемент видимий (доступний) з усіх методів у програмі.
Виключення складає випадок, коли клас успадкований як private. Тоді, навіть public-елементи цього класу будуть недоступні в успадкованих класах. Більш детально про використання модифікаторів доступу для класу можна прочитати тут.
Рисунок 6. Модифікатор доступу public. Доступ до елементу класу з будь-якого методу в програмі
Рисунок 7. Модифікатор доступу public. Доступ з успадкованого класу
⇑
2.3. Модифікатор доступу protected. Особливості застосування
Модифікатор доступу protected актуальний у випадках, коли класи утворюють ієрархію успадкування. Якщо в класі оголошено елемент (функція, член даних) з модифікатором доступу protected, то для нього діють наступні правила:
- елемент класу недоступний з будь-якого зовнішнього методу (рисунок 8) якщо цей метод не є дружнім;
- елемент класу доступний з внутрішніх методів класу (рисунок 8). Тут слід зауважити, що protected-елемент класу також доступний з екземпляру класу, якщо цей екземпляр оголошується у внутрішньому методі класу;
- елемент класу доступний з дружніх функцій класу (рисунок 9);
- елемент класу доступний з методів дружнього класу (рисунок 9);
- елемент класу доступний з методів успадкованого класу (рисунок 10);
- елемент класу недоступний з екземплярів успадкованого класу (рисунок 11). Це правило не стосується “дружніх” методів та методів “дружніх” класів.
Рисунок 8. Модифікатор доступу protected. Немає доступу з екземпляру класу, якщо цей екземпляр створено в “недружньому” методі
На рисунку 8 продемонстровано два види доступу до protected-елементу класу:
- через екземпляр (об’єкт) класу, який оголошується у внутрішньому методі класу Method();
- безпосередній доступ як до члена даних класу.
Рисунок 9. Модифікатор доступу protected. Доступ з “дружніх” методів та методів “дружніх” класів
Рисунок 10. Модифікатор доступу protected. Доступ з методів успадкованого класу
Рисунок 11. Модифікатор доступу protected. Немає доступу з екземплярів успадкованого класу
⇑
Зв’язані теми
⇑