Выбрать главу

// Возврат ссылки.

#include <iostream>

using namespace std;

double &f();

double val = 100.0;

int main()

{

 double newval;

 cout << f() << '\n'; // Отображаем значение val.

 newval = f(); // Присваиваем значение val переменной newval.

 cout << newval << '\n'; // Отображаем значение newval.

 f() = 99.1; // Изменяем значение val.

 cout << f() << '\n'; // Отображаем новое значение val.

 return 0;

}

double &f()

{

 return val; // Возвращаем ссылку на val.

}

Вот как выглядят результаты выполнения этой программы.

100

100

99.1

Рассмотрим эту программу подробнее. Судя по прототипу функции f(), она должна возвращать ссылку на double-значение. За объявлением функции f() следует объявление глобальной переменной val, которая инициализируется значением 100. При выполнении следующей инструкции выводится исходное значение переменной val.

cout << f() << '\n'; // Отображаем значение val.

После вызова функция f() возвращает ссылку на переменную val. Поскольку функция f() объявлена с "обязательством" вернуть ссылку, при выполнении строки

return val; // Возвращаем ссылку на val.

автоматически возвращается ссылка на глобальную переменную val. Эта ссылка затем используется инструкцией cout для отображения значения val.

При выполнении строки

newval = f(); //Присваиваем значение val переменной newval.

ссылка на переменную val, возвращенная функцией f(), используется для присвоения значения val переменной newval.

А вот самая интересная строка в программе.

f() = 99.1; // Изменяем значение val.

При выполнении этой инструкции присваивания значение переменной val становится равным числу 99,1. И вот почему: поскольку функция f() возвращает ссылку на переменную val, эта ссылка и является приемником инструкции присваивания. Таким образом, значение 99,1 присваивается переменной val косвенно, через ссылку на нее, которую возвращает функция f().

Наконец, при выполнении строки

cout << f() << '\n'; // Отображаем новое значение val.

отображается новое значение переменной val (после того, как ссылка на переменную val будет возвращена в результате вызова функции f() в инструкции cout).

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

#include <iostream>

using namespace std;

double &change_it(int i);

// Функция возвращает ссылку.

double vals[] = {1.1, 2.2, 3.3, 4.4, 5.5};

int main()

{

 int i;

 cout << "Вот исходные значения: ";

 for(i=0; i<5; i++)

  cout << vals[i] << ' ';

 cout << '\n';

 change_it(1) = 5298.23; // Изменяем 2-й элемент.

 change_it(3) = -98.8; // Изменяем 4-й элемент.

 cout << "Вот измененные значения: ";

 for(i=0; i<5; i++)

  cout << vals[i] << ' ';

 cout << '\n';

 return 0;

}

double &change_it(int i)

{

 return vals[i]; // Возвращаем ссылку на i-й элемент.

}

Эта программа изменяет значения второго и четвертого элементов массива vals. Результаты ее выполнения таковы.

Вот исходные значения: 1.1 2.2 3.3 4.4 5.5