Ссылочные параметры. Передача аргументов по ссылке.
Ссылочные переменные используются достаточно редко: значительно удобнее
использовать саму переменную, чем ссылку на нее. В качестве параметров функции
ссылки имеют более широкое применение. Ссылки особенно полезны в функциях,
возвращающих несколько объектов (значений). Для иллюстрации высказанного
положения рассмотрим программу:
#include <iostream>
using namespace std;
//Обмен с использованием указателей.
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 << "Change whis pointers:\n";
cout << "x = " << x << " y = " <<y <<"\n";
interchange_ptr (&x,&y);
cout << "x = " << x << " y = " << y <<"\n";
cout << "-----------------------------------------" <<"\n";
cout << "Change whis references:\n";
cout << "x = " << x << " y = " << y <<"\n";
interchange_ref (x,y);
cout << "x = " << x << " y = " << y <<"\n";
}
|
В функции 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.
Теперь, когда мы познакомились с ссылками, перейдём к следующему разделу и
рассмотрим одно из их предназначений.