ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн
Вызов функции в качестве лівого операнда операции присваивания
Вспомним, что вызовы обычных функций, в том случае, если они возвращают значение, могут использоваться как само это значение:
у = squareroot(x);
Здесь значение, возвращаемое функцией squareroot(), присваивается пере- менной у. Вызов функции интерпретируется как значение, получаемое при его
выполнении. С другой стороны, функция, возвращающая ссылку, интерпрети- руется как переменная. Возвращение функцией ссылки равносильно возврату псевдонима переменной, входящей в оператор return. В программе RETREF функ- ция setx() возвращает ссылку на переменную x. Это и объясняет тот факт, что вызов функции setx() может использоваться в качестве левого операнда опера- ции присваивания.
Из вышесказанного следует вывод: с помощью ссылки вы не можете возвра- тить из функции константу. Нельзя определять функцию setx() следующим об- разом:
int& setx() {
return 3;
}
Если попытаться скомпилировать программу, содержащую такую функцию, то компилятор сообщит о необходимости наличия lvalue, то есть некоторого эле- мента программы, которому можно присвоить значение. Таким элементом мо- жет являться переменная, но не может являться константа.
Можно попытаться обойти это ограничение следующим образом, введя ло- кальную переменную:
int& setx() {
int x = 3;
return x; // ошибка
}
Однако и в этом случае компилятор возвратит ошибку. Проблема заключается в том, что при выходе из функции локальные переменные уничтожаются, и дей- ствие по возвращению ссылки на несуществующую переменную теряет смысл.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
