using namespace std;
int main()
{
int Original = 30;
cout << "Original = " « Original « endl;
cout « "Original is at address: " « hex « &Original « endl;
int& Ref = Original;
'.I:
|
cout
|
«
|
"Ref is
|
at
|
address:
|
" «
|
hex
|
« &Ref
|
«
|
endl;
|
_i:
|
int&
|
Ref2 = Ref;
|
at
|
address:
|
" «
|
hex
|
«
|
&Ref2 «
|
endl;
|
15:
|
cout
|
«
|
"Ref2 is
|
14:
|
cout
|
«
|
"Ref2 gets
|
value, Ref2 =
|
" «
|
dec
|
«
|
Ref2 « endl;
|
return 0;
1": }
Результат
Original = 30
Original is at address: 0044FB5C
Ref is at address: 0044FB5C
Ref2 is at address: 0044FB5C
Ref2 gets value, Ref2 = 30
~ 3ak. 3626
194 ЗАНЯТИЕ 8- Указатели и ссылки
Анализ
Вывод показывает, что ссылки, независимо от того, инициализируются ли они исхо дной переменной, как можно заметить в строке 9, или присвоением ссылки, как в стро ке 12, ссылаются на ту же область в памяти, где содержится исходное значение. Таким образом, ссылки — это настоящие псевдонимы, т.е. просто другое имя переменной O rig in a l . Отображение значения с использованием ссылки R ef 2 в строке 14 дает такой же ре зультат, как и при использовании переменной O r i g in a l в строке 6, поскольку псевдоним R e f2 и переменная O r i g in a l относятся к той же области в памяти.
Зачем нужны ссылки
Ссылки позволяют работать с областью памяти, которой они инициализируются. Это делает ссылки особенно полезными при создании функций. Как уже было сказано на за нятии 7, “Организация кода при помощи функций”, типичная функция объявляется так:
ТипВозвращаемогоЗначения СделатьНечто {Тип Параметр);
Функция СделатьНечто () вызывается так:
ТипВозвращаемогоЗначения Результат = СделатьНечто {аргумент); // вызов функции
Приведенный выше код привел бы к копированию аргумента в параметр, который за тем использовался бы функцией СделатьНечто (). Этап копирования может быть весьма продолжительным, если рассматриваемый аргумент занимает много памяти. Аналогич но, когда функция СделатьНечто () возвращает значение, оно копируется в Результат. Было бы хорошо, если бы удалось избежать или устранить этапы копирования, позволив функции воздействовать непосредственно на данные в стеке вызывающей стороны. Ссыл ки позволяют сделать именно это.
Версия функции без этапа копирования выглядит следующим образом:
ТипВозвращаемогоЗначения СделатьНечто {ТипЬ Параметр); // обратите внимание на ссылку &
Эта функция была бы вызвана так:
ТипВозвращаемогоЗначения Результат = СделатьНечто {аргумент);
Поскольку аргумент передается по ссылке, параметр не будет копией аргумента, а ско рее псевдонимом последнего, как R ef в листинге 8.17. Кроме того, функция, которая полу чает параметр как ссылку, может возвращать значение, используя ссылочные параметры. Рассмотрим листинг 8.18, чтобы понять, как функции могут использовать ссылки вместо возвращаемых значений.
ЛИСТИНГ 8.18. Функция вычисляет квадрат числа и возвращает его в параметре по ссылке
Do'stlaringiz bilan baham: |