Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СИ++(лекции).doc
Скачиваний:
23
Добавлен:
27.03.2015
Размер:
551.42 Кб
Скачать

3. Ссылки

В языке СИ++ ссылка определяется как другое имя уже существующего объекта. Именно поэтому ссылку иногда называют псевдонимом. Основные достоинства ссылок проявляется при их использовании в функциях, но они могут быть использованы и сами по себе. Для определения ссылки используется символ &, если он используется в таком контексте

Тип & имя_ссылки инициализатор

В соответствии с синтаксисом инициализатора, наличие которого обязательно, определение ссылки может быть таким

Тип & имя_ссылки = выражение;

Тип & имя_ссылки( выражение);

Раз ссылка есть «другое имя» уже существующего объекта, то в качестве выражения может быть использовано инициализирующее выражение, имеющее леводопустимое появление. Значением ссылки после инициализации становится адрес этого объекта. Например,

int x[6]={1,-3,4,-10,5,12},n=6,i;

int&m=x[0],&nn(x[1]);

cout<<x[0]<<" "<<m<<'\n';

cout<<x[1]<<" "<<nn<<'\n';

Результат: 1 1

-3 -3

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

#include "stdafx.h"

int& max(int*x,int n);

int _tmain(int argc, _TCHAR* argv[])

{

int x[6]={1,-3,4,-10,5,12},n=6,i,y;

for(i=0;i<n;i++)

cout<<x[i]<<" ";

cout<<'\n';

// выводится на экран 1 -3 4 -10 5 12

max(x,n)=-12;//значение максимального элемента изменяется на -12

for(i=0;i<n;i++)

cout<<x[i]<<" ";

cout<<'\n';

// выводится на экран 1 -3 4 -10 5 -12

max(x,n)=-1// значение максимального элемента изменяется на -1

for(i=0;i<n;i++)

cout<<x[i]<<" ";

cout<<'\n';

// выводится на экран 1 -3 4 -10 -1 12

y=max(x,n);

cout<<y<<" "<<max(x,n)<<'\n';

// выводится на экран 4 4

cin.get();

return 0;

}

int& max(int*x,int n)

{

int v=x[0],imax=0;

for(int i=1;i<n;i++)

{

if(x[i]>v)

{

v=x[i];

imax=i;

}

}

return x[imax];

}

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

void invert(int&k)

{ k=-k;}

void invert1(int k)

{ k=-k;}

int _tmain(int argc, _TCHAR* argv[])

{

int y=4;

invert1(y);

cout<<y<<'\n';

//результат 4

invert(y);

cout<<y<<'\n';

//результат -4

cin.get();

return 0;

}

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