Это относительно часто, но это плохой стиль.
Если вы, например, посмотрите на STL, вы заметите, что класс, который возвращает const&
или &
во внутреннее состояние, обычно является обычными контейнерами и предоставляет такой доступ только для того, что вы на самом деле храните. в них. У вас, очевидно, нет способа изменить непосредственно такие атрибуты, как size
или внутренние узлы двоичного дерева.
Предоставление прямого доступа к элементам нарушает инкапсуляцию. Вы не только теряете все инварианты класса по отношению к этим элементам, но также делаете их частью своего API и, следовательно, не можете изменить реализацию класса, не обновив также все клиенты.
Насколько мне известно, это два типа классов в C ++:
struct BigBag {
Foo _foo;
Bar _bar;
FooBar _foobar;
};
class MyClass {
public:
explicit MyClass(int a, int b);
int getSomeInfo();
void updateDetails(int a, int b);
private:
// no peeking
};
То есть: либо это просто набор связанных элементов, в этом случае все общедоступно, и все готово, либо есть инварианты классов и / или вас интересует его API, потому что в нем много клиентского кода, в этом случае вы не раскрываете подробности реализации.