Инкапсуляция - это идея, что вы можете получить доступ к элементу данных класса только через методы интерфейса. Результатом использования метода является «скрытие» фактической реализации элемента данных, так что вы можете изменить его без необходимости изменять код, использующий этот класс, через методы интерфейса (при условии, что вы не измените способ их использования). определены).
С другой стороны, если вы не используете методы интерфейса, чтобы скрыть реализацию элемента данных, весь ваш код, который его использует, необходимо будет изменить перед любым изменением в элементе данных.
Скажите, что у вас есть класс с вектором строк, содержащий список имен. Если вы сделаете этот вектор общедоступным, то все другие классы могут решить использовать его напрямую и получить доступ к строкам, которые он содержит, по их индексу в векторе (скажем, индекс действует как ключ для идентификации строки).
Позже вы можете решить, что вам нужна карта для управления всеми этими строками (ваши требования изменились). Вы измените определение элемента данных на карту, и ваш код больше не будет компилироваться. Это значение слова «практически неизменный».
«Правильный» способ управления этим путем инкапсуляции - сделать элемент данных приватным и определить метод интерфейса, например:
std::string getStringWithKey(int index);
этот метод будет обращаться к вектору в первой реализации и к карте во втором случае. Все это прозрачным образом: код, использующий метод (вместо прямого доступа к элементу данных), изменять не нужно, поэтому вы можете изменять реализацию элемента данных по своему усмотрению практически без затрат.
Это упрощение, потому что дизайн интерфейсов не прост, и интерфейсы тоже меняются, но я надеюсь, что это помогает прояснить ситуацию.