Этот код:
int& methodTwo() { return x; }
Означает, что функция возвращает ссылку на целое число. Так же, как при передаче значения по ссылке на функцию, если изменяется возвращаемое значение methodTwo
, так и значение, возвращаемое methodTwo
. В этом случае поле класса x
.
В написанном вами коде это означает, что вы позволяете закрытой переменной x
выходить из ее области видимости (поле класса) и передаваться во внешний мир. Это, безусловно, плохая практика (потому что x
можно изменить таким образом, что это может нарушить класс foo
, но это, безусловно, допустимо.
Помните общедоступный / частный / защищенный только во время компиляции . Как только ваше приложение скомпилировано, закрытые поля располагаются рядом с открытыми полями, и защита от модификации не защищена. То же самое верно для управляемых языков, таких как C # и Java.
Как правило, вам не следует возвращать ссылки, потому что это затрудняет понимание, когда конструктор / деструктор вызывается. Тем не менее, возврат ссылки может быть быстрее. Если ваш метод возвратил структурный тип, который был ОГРОМНЫМ, возвращение константной ссылки на тот же тип структуры должно занимать всего четыре-восемь байтов (указатель на этот объект). Тем не менее, есть лучшие способы оптимизации для такого рода вещей.