C++. Модифікатори доступу private, protected, public. Інкапсуляція даних в класі

C++. Модифікатори доступу private, protected, public. Інкапсуляція даних в класі


Зміст





Пошук на інших ресурсах:

1. Випадки застосування модифікаторів доступу private, protected, public

Парадигма об’єктно-орієнтованого програмування передбачає можливість задавання рівня доступності елементів класів. Рівень доступності дозволяє регулювати доступ до даних та методів класу. Одні елементи класу можуть бути загальнодоступні, інші – приховані. Приховування даних та методів у класі називається інкапсуляцією.

У мові C++ рівень доступності визначається з допомогою спеціальних модифікаторів private, protected, public. Застосування цих модифікаторів може бути використане у двох випадках:

  • у випадку оголошення елементів класу. Цей випадок висвітлюється у даній темі;
  • у випадку успадкування класів. Більш детально про застосування модифікаторів доступу при успадкуванні класів можна переглянути тут.

 

2. Застосування модифікаторів доступу для елементів класу
2.1. Модифікатор доступу private. Особливості застосування

Якщо у класі оголошується елемент (функція, член даних) у розділі private, то для нього діють наступні правила доступу:

  • елемент недоступний будь-яким екземплярам методів інших класів або методів, що не є “дружніми” (рисунок 1) до класу;
  • елемент недоступний з успадкованих класів (рисунок 2);
  • елемент доступний з методів, які реалізовані у класі (рисунок 3);
  • елемент доступний з дружніх функцій до класу (рисунок 4);
  • елемент доступний з методів дружніх класів (рисунок 5).

C++. Модифікатор доступу private. Немає доступу з екземпляру класу до private-елементу класу

Рисунок 1. Модифікатор доступу private. Немає доступу з екземпляру класу до private-елементу класу value

C++. Модифікатор доступу private. Немає доступу до private-елементу класу з успадкованого класу

Рисунок 2. Модифікатор доступу private. Немає доступу до private-елементу класу з успадкованого класу

C++. Модифікатор доступу private. Доступ до елементу класу з внутрішнього методу класу

Рисунок 3. Модифікатор доступу private. Доступ до елементу класу з внутрішнього методу класу

C++. Модифікатор доступу private. Доступ до елементу класу з дружньої функції (методу)

Рисунок 4. Модифікатор доступу private. Доступ до елементу класу з дружньої функції (методу)

Якщо в коді, зображеному на рисунку 4, в оголошенні класу A перед іменем функції SetValue() забрати ключове слово friend, то доступу до змінної value класу не буде. Як результат, у функції SetValue() в рядку

objA.value = 33;

компілятор буде видавати помилку на кшталт

Member A::value is inaccessible

 

C++. Модифікатор доступу private. Доступ до private-елементу класу з методу дружнього класу

Рисунок 5. Модифікатор доступу private. Доступ до private-елементу класу з методу дружнього класу

 

2.2. Модифікатор доступу public. Особливості застосування

Якщо в класі оголошено елемент з модифікатором доступу public, у цьому випадку справедливе наступне правило:

  • елемент видимий (доступний) з усіх методів у програмі.

Виключення складає випадок, коли клас успадкований як private. Тоді, навіть public-елементи цього класу будуть недоступні в успадкованих класах. Більш детально про використання модифікаторів доступу для класу можна прочитати тут.

 

C++. Модифікатор доступу public. Доступ до елементу класу з будь-якого методу в програмі

Рисунок 6. Модифікатор доступу public. Доступ до елементу класу з будь-якого методу в програмі

C++. Модифікатор доступу public. Доступ з успадкованого класу

Рисунок 7. Модифікатор доступу public. Доступ з успадкованого класу

 

2.3. Модифікатор доступу protected. Особливості застосування

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

  • елемент класу недоступний з будь-якого зовнішнього методу (рисунок 8) якщо цей метод не є дружнім;
  • елемент класу доступний з внутрішніх методів класу (рисунок 8). Тут слід зауважити, що protected-елемент класу також доступний з екземпляру класу, якщо цей екземпляр оголошується у внутрішньому методі класу;
  • елемент класу доступний з дружніх функцій класу (рисунок 9);
  • елемент класу доступний з методів дружнього класу (рисунок 9);
  • елемент класу доступний з методів успадкованого класу (рисунок 10);
  • елемент класу недоступний з екземплярів успадкованого класу (рисунок 11). Це правило не стосується “дружніх” методів та методів “дружніх” класів.

 

C++. Модифікатор доступу protected. Немає доступу з екземпляру класу, якщо цей екземпляр створено в "недружньому" методі

Рисунок 8. Модифікатор доступу protected. Немає доступу з екземпляру класу, якщо цей екземпляр створено в “недружньому” методі

На рисунку 8 продемонстровано два види доступу до protected-елементу класу:

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

 

C++. Модифікатор доступу protected. Доступ з "дружніх" методів та методів "дружніх" класів

Рисунок 9. Модифікатор доступу protected. Доступ з “дружніх” методів та методів “дружніх” класів

 

C++. Модифікатор доступу protected. Доступ з методів успадкованого класу

Рисунок 10. Модифікатор доступу protected. Доступ з методів успадкованого класу

C++. Модифікатор доступу protected. Немає доступу з екземплярів успадкованого класу

Рисунок 11. Модифікатор доступу protected. Немає доступу з екземплярів успадкованого класу

 


Зв’язані теми