ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн
Возвращение значения по ссылке
Теперь, когда мы рассмотрели глобальные переменные, мы можем перейти к рас- смотрению еще одного аспекта программирования на C++, который, возможно, покажется несколько нестандартным. Подобно тому как мы передавали в функ- цию аргументы с помощью ссылок, мы можем возвращать значение функции по ссылке. Причины для использования ссылочного механизма при возвращении значения функцией пока в основном будут вам не совсем понятны. Одной из причин, как мы увидим в главе 11 «Виртуальные функции», является необходи- мость избежать копирования объектов большого размера. Другой причиной явля-
ется открывающаяся возможность использовать вызов функции в качестве лево- го операнда операции присваивания. Чтобы не тратить время на малопонятные словесные манипуляции, приведем пример программы RETREF, иллюстрирующей данный механизм в действии:
// retref.cpp
// возвращение значения по ссылке #include <iostream> using namespace std;
int x; // глобальная переменная
int& setx(); // прототип функции
int main()
{ // присваивание значения x при
setx() = 92; // помощи вызова функции слева
cout << "x=" << x << endl;// вывод нового значения x return 0;
}
//--------------------------------------------------------
int& setx() {
return x; // возвращает значение, которое будет изменено
}
В этой программе функция setx(), согласно своему прототипу, имеет тип воз- вращаемого значения int&:
int& setx();
Внутри функции содержится оператор
return x;
где переменная x была определена как глобальная. Теперь у вас появляется на первый взгляд странная возможность располагать вызов функции слева от знака равенства в операции присваивания:
setx() = 92;
В результате переменной, возвращаемой функцией, присваивается значение, стоящее справа от знака равенства. Таким образом, оператор, приведенный вы- ше, присваивает переменной x значение, равное 92. Это подтверждается и ре- зультатом работы программы на экране:
Х=92
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