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

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

// Использование ссылочного параметра.

#include <iostream>

using namespace std;

void f(int &i);

int main()

{

 int val = 1;

 cout << "Старое значение переменной vaclass="underline" " << val << '\n';

 f(val); // Передаем адрес переменной val функции f().

 cout << "Новое значение переменной vaclass="underline" " << val << '\n';

 return 0;

}

void f(int &i)

{

 i = 10; // Модификация аргумента, заданного при вызове.

}

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

Старое значение переменной vaclass="underline" 1

Новое значение переменной vaclass="underline" 10

Обратите особое внимание на определение функции f().

void f (int &i)

{

 i = 10; // Модификация аргумента, заданного при вызове.

}

Итак, рассмотрим объявление параметра i. Его имени предшествует символ который "превращает" переменную i в ссылочный параметр. (Это объявление также используется в прототипе функции.) Инструкция

i = 10;

(в данном случае она одна составляет тело функции) не присваивает переменной i значение 10. В действительности значение 10 присваивается переменной, на которую ссылается переменная i (в нашей программе ею является переменная val). Обратите внимание на то, что в этой инструкции не используется оператор который необходим при работе с указателями. Применяя ссылочный параметр, вы тем самым уведомляете С++-компилятор о передаче адреса (т.е. указателя), и компилятор автоматически разыменовывает его за вас. Более того, если бы вы попытались "помочь" компилятору, использовав оператор то сразу же получили бы сообщение об ошибке (и вправду "ни одно доброе дело не остается безнаказанным").

Поскольку переменная i была объявлена как ссылочный параметр, компилятор автоматически передает функции f() адрес любого аргумента, с которым вызывается эта функция. Таким образом, в функции main() инструкция

f(val); // Передаем адрес переменной val функции f().

передает функции f() адрес переменной val (а не ее значение). Обратите внимание на то, что при вызове функции f() не нужно предварять переменную val оператором "&". (Более того, это было бы ошибкой.) Поскольку функция f() получает адрес переменной val в форме ссылки, она может модифицировать значение этой переменной.

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

#include <iostream>

using namespace std;

// Объявляем функцию swap() с использованием ссылочных параметров.

void swap(int &х, int &у);

int main()

{

 int i, j;

 i = 10; j = 20;

 cout << " Исходные значения переменных i и j: ";

 cout << i << ' ' << j << '\n';

 swap (j, i);

 cout << " Значения переменных i и j после обмена: ";

 cout << i << ' ' << j << '\n';

 return 0;

}

/* Здесь функция swap() определяется в расчете на вызов по ссылке, а не на вызов по значению. Поэтому она может выполнить обмен значениями двух аргументов, с которыми она вызывается.

*/

void swap(int &х, int &у)