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