Кажется, что большинство людей не прочитали ваш вопрос должным образом, вопрос в том, должны ли методы класса обращаться к членам его собственного класса использовать геттеры и сеттеры; не о внешней сущности, обращающейся к членам класса.
Я бы не стал использовать getter и setter для доступа к собственным членам класса.
Тем не менее, я также держу свои классы маленькими (обычно около 200-500 строк), так что если мне нужно изменить поля или изменить их реализации или как они рассчитываются, поиск и замена не будет слишком большой работой (на самом деле, я часто меняю имена переменных / классов / функций на ранних этапах разработки, я привередлив в выборе имен).
Я использую getter и setters только для доступа к своим собственным ученикам, когда я ожидаю изменить реализацию в ближайшем будущем (например, если я пишу неоптимальный код, который можно написать быстро, но планирует оптимизировать его в будущее), что может привести к радикальному изменению используемой структуры данных. И наоборот, я не использую геттер и сеттер до того, как у меня уже есть план; в частности, я не использую геттер и сеттер в ожидании изменения вещей, которые я, скорее всего, никогда не изменю.
Для внешнего интерфейса я строго придерживаюсь открытого интерфейса; все переменные являются частными, и я избегаю friend
за исключением перегрузок операторов; Я использую protected
членов консервативно, и они считаются общедоступным интерфейсом. Однако даже для общедоступного интерфейса я обычно избегаю использования методов прямого получения и установки, поскольку они часто указывают на плохой дизайн ОО (каждый программист на любом языке должен читать: Почему методы получения и установки являются злыми ). Вместо этого у меня есть методы, которые делают что-то полезное, а не просто выборку значений. Например:
class Rectangle {
private:
int x, y, width, height;
public:
// avoid getX, setX, getY, setY, getWidth, setWidth, getHeight, setHeight
void move(int new_x, int new_y);
void resize(int new_width, int new_height);
int area();
}