Главная->Інформатика та програмування->Содержание->Вызов функции в качестве лівого операнда операции присваивания

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн

Вызов функции в качестве лівого операнда операции присваивания

Вспомним, что вызовы обычных функций, в том случае, если они возвращают значение, могут использоваться как само это значение:

у = squareroot(x);

Здесь значение, возвращаемое функцией squareroot(), присваивается пере- менной у. Вызов функции интерпретируется как значение, получаемое при его

выполнении. С другой стороны, функция, возвращающая ссылку, интерпрети- руется как переменная. Возвращение функцией ссылки равносильно возврату псевдонима переменной, входящей в оператор return. В программе RETREF функ- ция setx() возвращает ссылку на переменную x. Это и объясняет тот факт, что вызов функции setx() может использоваться в качестве левого операнда опера- ции присваивания.

Из вышесказанного следует вывод: с помощью ссылки вы не можете возвра- тить из функции константу. Нельзя определять функцию setx() следующим об- разом:

int& setx() {

  return 3;

}

Если попытаться скомпилировать программу, содержащую такую функцию, то компилятор сообщит о необходимости наличия lvalue, то есть некоторого эле- мента программы, которому можно присвоить значение. Таким элементом мо- жет являться переменная, но не может являться константа.

Можно попытаться обойти это ограничение следующим образом, введя ло- кальную переменную:

int& setx() {

int x = 3;

return x;              // ошибка

}

Однако и в этом случае компилятор возвратит ошибку. Проблема заключается в том, что при выходе из функции локальные переменные уничтожаются, и дей- ствие по возвращению ссылки на несуществующую переменную теряет смысл.

 

34