Инкапсуляция
Инкапсуляция - это принцип объектно-ориентированного программирования, который заключается в скрытии деталей реализации от внешнего мира и предоставлении интерфейса для взаимодействия с объектом.
- что всё это значит и для чего этого вообще нужуно?
Ответ на этот вопрос хорошо ответит картинка ниже.

Пожалуй это лучшая иллюстрация понятия инкапсуляции. Данный объект часы нужен для получения текущего времени, время на часах можно настроить несколькими способами.
- Открыть крышку часов и покрутить шестерёнки (это может привести к поломке).
- Использовать специальный винт (безопасно).
Если вдуматься мы пользуемся многими вещами не вникая в то, как именно эти вещи работают.
В данном примере часы. Нам не важно как именно они работают, нам важен факт того, что мы можем получить информацию о текущем времени. Для получения времени мы смотрим на дисплей, для изменения времени мы крутим винт.
Возьмём другой пример "электрочайник", это устройство позволяет изменить температуру воды. Опять же, нам не важно как, нам важно, что вода была холодной, а стала горячей. Для изменения температуры воды мы нажимаем кнопку, хотя могли бы разобрать чайник и замкнуть контакты нагревателя напрямую, но в этом случае есть вероятность получить удар током.
В программировании всё точно так-же. У объектов имеются поля, к некоторым из этих полей нужно закрыть доступ, чтобы напрямую нельзя было менять значение. Как это сделать? Давайте разбираться - это просто!
Модификаторы доступа
В C++ существуют три модификатора доступа:
private (закрытые члены)-
Члены класса, объявленные как
private
, доступны только внутри методов этого класса -
Поля обычно делают private, чтобы контролировать доступ к ним
-
Вспомогательные методы также часто объявляют private
-
Public-члены образуют интерфейс класса
-
Конструкторы обычно делают public, чтобы можно было создавать объекты
-
Методы для работы с объектом также объявляют public
-
Protected-члены доступны внутри класса и в классах-наследниках
-
Используются при наследовании (хотя в этой лекции мы его не рассматриваем)
Про классы наследники будет рассказаоно далее в теме "Наследование"
Методы доступа (геттеры и сеттеры)
Геттеры (методы получения данных)-
Позволяют безопасно получать значения private-полей
-
Обычно объявляются как const-методы
-
Могут форматировать или преобразовывать данные перед возвратом
-
Позволяют безопасно изменять private-поля
-
Могут включать проверку корректности новых значений
-
Могут выполнять дополнительные действия при изменении поля
Пример
-
Основное хранилище (
celsius
) объявлено как private -
Все изменения происходят через сеттеры с проверкой
-
Пользователь может работать с температурой в разных шкалах
-
Некорректные значения автоматически отклоняются
-
Внутренняя реализация скрыта (можно изменить хранение на Fahrenheit без изменения интерфейса)
Инкапсуляция и классы vs структуры
В C++ разница между class и struct только в умолчательном уровне доступа:
-
Используйте
class
для сложных объектов с поведением -
Используйте
struct
для простых агрегатов данных (POD - Plain Old Data) -
В любом случае явно указывайте модификаторы доступа для ясности
Дружественные функции и классы
Дружественные (friend) элементы - исключение из инкапсуляции:
-
Friend-элементы имеют доступ к private-членам
-
Нарушают инкапсуляцию, поэтому должны использоваться обдуманно
-
Применяются для перегрузки операторов или в особых случаях
Практические рекомендации
-
Делайте поля private по умолчанию
-
Предоставляйте минимально необходимый public-интерфейс
-
Используйте const для методов, не изменяющих состояние
-
Избегайте избыточных сеттеров - не все поля должны быть изменяемы
-
Инкапсулируйте сложную логику внутри методов
-
Избегайте friend без крайней необходимости
Инкапсуляция - фундаментальный принцип ООП, который позволяет:
-
Защищать внутреннее состояние объектов
-
Скрывать сложность реализации
-
Обеспечивать стабильный интерфейс
-
Упрощать модификацию и сопровождение кода
Правильное применение инкапсуляции делает код:
-
Более надежным
-
Легче для понимания
-
Проще в тестировании
-
Гибче к изменениям