На этом шаге мы рассмотрим самое популярное использование ссылок:
использование
в качестве параметров функций.
Ссылочные переменные используются достаточно редко: значительно удобнее использовать саму переменную, чем ссылку на нее. В качестве параметров функции ссылки имеют более широкое применение. Ссылки особенно полезны в функциях, возвращающих несколько объектов (значений). Для иллюстрации высказанного положения изменим программу, приведенную на 46 шаге, где в функции осуществляется обмен значениями двух переменных. Добавим в программу еще одну функцию, выполняющую тот же обмен, только с использованием ссылок.
#include <iostream.h> //Обмен с использованием указателей. void interchange_ptr (int *u,int *v) { int temp=*u; *u = *v; *v = temp; } /* ------------- */ //Обмен с использованием ссылок. void interchange_ref (int &u,int &v) { int temp=u; u = v; v = temp; } /* ------------- */ void main () { int x=5,y=10; /* --------------------------------------- */ cout << "Обмен с использованием указателей:\n"; cout << "Вначале x = " << x << " и y = " << y << endl; interchange_ptr (&x,&y); cout << "Теперь x = " << x << " и y = " << y << endl; cout << "-----------------------------------------" << endl; cout << "Обмен с использованием ссылок:\n"; cout << "Вначале x = " << x << " и y = " << y << endl; interchange_ref (x,y); cout << "Теперь x = " << x << " и y = " << y << endl; }
В функции interchange_ptr() параметры описаны как указатели. Поэтому в теле этой функции выполняется их разименование, а при обращении к этой функции в качестве фактических переменных используются адреса (&x,&y) тех переменных, значения которых нужно поменять местами. В функции interchange_ref() параметрами являются ссылки. Ссылки обеспечивают доступ из тела функции к фактическим параметрам, в качестве которых используются обычные переменные, определенные в программе.
Ссылки и указатели в качестве параметров функций тесно связаны. Рассмотрим следующую небольшую функцию:
void f(int *ip) { *ip = 12; }
Внутри этой функции осуществляется доступ к переданному аргументу, адрес которого хранится в указателе ip, с помощью следующего оператора:
f(&ivar); //Передача адреса ivar.
Внутри функции выражение *ip = 12; присваивает 12 переменной ivar, адрес которой был передан в функцию f(). Теперь рассмотрим аналогичную функцию, использующую ссылочные параметры:
void f(int &ir) { ir = 12; }
Указатель ip заменен ссылкой ir, которой присваивается значение 12. Выражение:
f(ivar); //Передача ivar по ссылке.
присваивает значение ссылочному объекту: передает ivar по ссылке
функции f(). Поскольку
ir ссылается на ivar, то ivar присваивается значение 12.
На следующем шаге мы закончим изучение ссылок: рассмотрим их
использование в
качестве результатов функций.