Во-первых, не все члены данных должны иметь геттеры и сеттеры, и я полагаю, вы можете видеть преимущество сохранения этих переменных закрытыми.
Во-вторых, большинство классов - это не просто случайные наборы данных. Они представляют вещи, о которых вы должны быть способны рассуждать самостоятельно. Как правило, это означает, что у них есть определенные свойства, от которых может зависеть разработчик (часто называемые «инвариантами классов»). Например, класс Rectangle должен иметь свойство, состоящее в том, что рисование линий между угловыми точками дает линии под прямым углом друг к другу. Если точки являются открытыми членами данных, любое случайное приложение может изменить точку, и тогда у вас будет прямоугольник, который не является прямоугольником. Если у вас есть функция сеттера, вы можете справиться с этим правильно.
В-третьих, рассмотрите обслуживание. В какой-то момент вы можете захотеть изменить реализацию класса, и вы можете задаться вопросом, сколько вещей вам придется изменить. Если члены данных являются общедоступными, изменение любой детали реализации может привести к поломке любой из программ, использующих этот класс. Вы застряли. Если есть геттеры и сеттеры, вы можете это компенсировать, чтобы установка значения могла сделать что-то более или менее сложное во внутренних органах, чтобы получить тот же эффект, что и раньше. Если у вас есть более абстрактные функции-члены, у вас будет очень мало проблем с внесением изменений.