Шаг 49.
Ссылки в качестве результатов функций

    Здесь рассматривается использование ссылок в качестве результатов функций.

    Функции могут возвращать ссылки на объекты при условии, что эти объекты существуют, когда функция неактивна. Таким образом, функции не могут возвращать ссылки на локальные автоматические переменные. Например, для функции, объявленной как

     double &rf(int p);

необходим аргумент целого типа, и она возвращает ссылку на объект double, предположительно объявленный где-то в другом месте.

    Проиллюстрируем сказанное конкретными примерами.


    Пример 1. Заполнение двумерного массива одинаковыми числами.
#include <iostream.h>
int a[10][2];
void main ()
{
	int & rf(int index); //Прототип функции.
	int b;
	cout << "Заполнение двумерного массива. ";
	cout << "Первый столбец заполняется обычным способом, ";
	cout << "а второй - через функцию.\n";
	for (int i=0;i<10;i++)
	{
	  cout << i+1 << "-й элемент: ";
	  cin >> b;
	  a[i][0] = b;
	  rf(i) = b;
	}
	cout << "Вывод двумерного массива.\n";
	cout << "1-й столбец   2-й столбец" << endl;
	for (i=0;i<10;i++)
		cout << a[i][0] << "\t\t" << rf(i) << endl;
}

int &rf(int index)
{
  return a[index][1]; //Возврат ссылки на элемент массива.
}
Текст этой программы можно взять здесь.

    Здесь объявляется глобальный двумерный массив a, состоящий из целых чисел. В начале функции main() содержится прототип ссылочной функции rf(), которая возвращает ссылку на целое значение второго столбца массива a, которое однозначно идентифицируется параметром-индексом index. Так как функция rf() возвращает ссылку на целое значение, то имя функции может оказаться слева от оператора присваивания, что продемонстрировано в строке:

	  rf(i) = b;


    Пример 2. Нахождение максимального элемента в массиве и замена его на нуль.
#include <iostream.h>
//Функция определяет ссылку на элемент
//массива с максимальным значением.
int &rmax(int n, int d[])
{
  int im=0;
  for (int i=1; i<n; i++)
	 im = d[im]>d[i]?im:i;
  return d[im];
}

void main ()
{
	int x[]={10, 20, 30, 14};
	int n=4;
	cout << "\nrmax(n,x) = " << rmax(n,x) << endl;
	rmax(n,x) = 0;
	for (int i=0;i<n;i++)
	  cout << "x[" << i << "]=" << x[i] << "  ";
	cout << endl;
}
Текст этой программы можно взять здесь.

    Результаты работы программы:

   rmax (n,x) = 30
   x[0]=10  x[1]=20  x[2]=0  x[3]=14

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

     cout << "\nrmax(n,x) = " << rmax(n,x) << endl;

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

     rmax(n,x) = 0;

снова осуществляется обращение к функции rmax(). Теперь уже по найденной ссылке максимальное значение заменяется на 0.

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


Предыдущий шаг Содержание Следующий шаг