Я часто пишу геттеры и сеттеры только потому, что для получения и настройки потребуется другой уровень доступа. И эти геттеры и сеттеры тривиальны (геттер только возвращает, сеттер только устанавливает значение, никакого другого кода внутри). Типичный случай, когда вы хотите, чтобы значение поля было доступно только для чтения для внешнего мира (и вы пишете целую кучу функций-получателей для каждого поля).
Геттеры и сеттеры - это скрытые функции. А вызов функции медленнее, чем просто установка поля, потому что вам нужно копировать аргументы, вставлять и выталкивать фрейм стека, копировать результат и т. Д.
Что ж, компиляторы могут оптимизировать вызов функции и встроить присваивание, но это то, что вы не можете контролировать. Даже встроенное ключевое слово в C ++ - это всего лишь подсказка, и компиляторы могут его игнорировать. Вы должны предполагать, что функция вызывается, и она будет работать медленнее.
Более того, никогда языки (например, C #) не поддерживают свойства и имитируют это, но это не что иное, как функции, которые выглядят как поле, вы даже не можете сказать, что это функция или поле (без помощи IDE).
Какие проблемы возникли бы, если бы мы могли установить разные модификаторы доступа для записи и чтения (как, например, в файловых системах), кроме простого указания, что это нарушит догматический принцип инкапсуляции?