- •Глава 1. Основные понятия.
- •Общие сведения о программах, лексемах и алфавите
- •Процесс создания программы
- •Основные типы.
- •Основные типы данных
- •Глава 2. Создание консольных приложений в среде VisualStudio
- •1. Создание проекта
- •2. Начальный состав проекта
- •3. Добавление новых элементов в проект
- •Глава 4. Адреса, указатели, массивы, память
- •1. Указатели и адреса объектов
- •2. Указатели на функции
- •3. Ссылки
- •Глава 5. Структуры и объединения
- •1. Структура как тип и совокупность данных
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не изменилось, так как в функцию передается только значение, так как формальный параметр описан как простая переменная. При обращении ко второй функции значение переменной меняется, так как в качестве формального параметра используется ссылка и происходит настраивание по месту расположения в памяти объекта, используемого в качестве фактического параметра.