Инкапсуляция — это принцип объектно-ориентированного проектирования, который подразумевает сокрытие внутреннего устройства объекта и предоставление только необходимого публичного интерфейса.
История вопроса: С самого появления ООП одной из ключевых задач стала защита внутреннего состояния объектов от некорректного изменения извне и обеспечение строгого контроля над логикой.
Проблема: Без инкапсуляции все данные и методы становятся доступны внешнему коду, что приводит к утрате контроля над состоянием объектов и появлению трудноуловимых ошибок.
Решение:
В C++ используются три спецификатора доступа: private, protected, public. private запрещает доступ к членам вне класса, protected даёт доступ только наследникам, public делает члены частью интерфейса.
Пример кода:
class Stack { private: int *data; int top; public: Stack(); void push(int val); int pop(); };
Ключевые особенности:
Правда ли, что private-члены нельзя изменить никаким образом вне класса?
Неправда. Можно использовать friend-функции, friend-классы или небезопасные приёмы (например, через приведение указателей или через undefined behavior).
В каком порядке применяются спецификаторы при наследовании (private, protected, public)?
Если наследование объявлено как private, все public и protected члены базового класса становятся private-членами производного класса.
Чем отличаются protected и private наследование?
При protected наследовании все public и protected члены базового класса становятся protected-членами производного; при private — все становятся private.
Все члены класса объявлены public, любой внешний код может изменять структуру и нарушать инварианты объекта.
Плюсы:
Минусы:
Используются только необходимые public-методы, остальные данные закрыты (private), состояние защищено.
Плюсы:
Минусы: