Учитывая, что классы и структуры в точности совпадают с доступом по умолчанию, вопрос заключается в том, как инкапсуляция внутреннего представления из интерфейса помогает создать более надежный код.
Основное отличие состоит в том, что вы контролируете, когда и как изменяются данные вашего класса, и, таким образом, вы можете контролировать свои инварианты классов. Рассмотрим простой векторный класс, который имеет указатель и размер. Имея их в частном порядке, вы можете контролировать их изменение: если вызывается метод resize
, указатель и переменная внутреннего размера будут согласованно обновляться, сохраняя инвариант, обеспечивающий доступ к любой позиции в диапазоне [0..size): хорошо определены. Если бы атрибуты-члены были общедоступными, пользовательский код обновлял бы хранилище или размер без фактического обновления другого поля, и этот инвариант мог быть поврежден.
Многие классы имеют внутренние инварианты для правильного использования. Если вы напишите класс, содержащий строку с адресами электронной почты пользователя, предоставив метод доступа, вы сможете контролировать, что переданное значение является действительным адресом электронной почты, в то время как если поле электронной почты было общедоступным, код пользователя мог бы сбросить его до чего угодно
Все дело в том, что вы контролируете доступ и изменение ваших членов, что уменьшает количество мест, где могут быть допущены ошибки, и / или ваши шансы обнаружить их.