C++ Программирование в среде С++ Builder 5


Ссылки - часть 2


Параметры функции мало чем отличаются от ее локальных автоматических переменных. Разница только в том, что они располагаются на стеке выше адреса в регистре ЕВР, а локальные переменные — ниже. Передача параметров при вызове функции эквивалентна созданию локальных переменных и инициализации их значениями соответствующих аргументов.

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

Тем самым параметры-ссылки делают возможной настоящую “передачу по ссылке” без использования явных указателей и адресов. Вот сравнение различных видов передачи параметров:

//////////////////////////////////////////////////

// RefPar.cpp: Передача параметров по ссылке.

//

#include <stdio.h>

void SwapVal(int x, int y)

// Передача значений.

{

int temp;

temp = x;

x = y;

у = temp;

}

void SwapPtr(int *x, int *y)

// Передача указателей.

{

int temp;

temp = *x;

*x = *y;

*y = temp;

}

void SwapRef(int &x, int &y)

// Передача ссылок.

{

int temp;

temp = x;

x = y;

y = temp;

}

int main(void)

(

int i = 11, i = 22;

printf("Initial values: i=%d,j=%d.\n", i,j ) ;

SwapVal(i, j);

printf ("After SwapVal():i = %d,j =%d.\n",i,j);

SwapPtr (&i, &j) ;

printf("After SwapPtr():i =%d,j=%d.\n",i,j);

SwapRef(i, j) ;

printf("After SwapRef():i =%d,j=%d.\n",i,j);

return 0;

Программа напечатает:

Initial values: i = 11, j = 22.

After SwapValO i = 11, j = 22.

After SwapPtr():i = 22, j = 11.

After SwapRef () i = 11, j =22.

Как и должно быть, функция SwapVal () не влияет на значения передаваемых ей переменных, поскольку она обменивает лишь локальные их копии. Функция SwapPtr () , принимающая указатели, обменивает значия исходных переменных, но требует явного указания адресов при вызове и явного их разыменования в теле переменной. Наконец, SwapRef () , с параметрами-ссылками, также обменивает значения переданных ей переменных. Причем она отличается от функции, принимающей параметры-значения, только заголовком. Тело SwapRef () и ее вызов выглядят совершенно аналогично функции SwapVal () .




Начало  Назад  Вперед