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-элементы этого класса будут недоступны в унаследованных классах. Более подробно об использовании модификаторов доступа для класса можно прочитать здесь.

 

С++. Модификатор доступа public. Доступ к элементу класса из любого метода в программе

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

 

С++. Модификатор доступа 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. Нет доступа из экземпляров унаследованного класса

 


Связанные темы