Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
s__ekzamen.docx
Скачиваний:
8
Добавлен:
18.12.2018
Размер:
113.34 Кб
Скачать

14. Ссылки (пример)

В С(С++) известны три способа передачи данных в функцию: по значению, посредством указателя и используя ссылки.

При передаче параметров в функцию они помещаются в стековую память. В отличие от стандартных типов данных (char, int, float и др.) объекты обычно требуют много больше памяти, при этом стековая память может существенно увеличиться. Для уменьшения объема передаваемой через стек информации в С(С++) используются указатели. В языке С++ наряду с использованием механизма указателей имеется возможность использовать неявные указатели (ссылки). Ссылка, по существу, является не чем иным, как вторым именем некоторого объекта.

Формат объявления ссылки имеет вид:

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

Ссылку нельзя объявить без ее инициализации. То есть ссылка всегда должна ссылаться на некоторый, существующий объект. Можно выделить следующие отличия ссылок и указателей. Во-первых, невозможность существования нулевых ссылок подразумевает, что корректность их не требуется проверять. А при использовании указателя требуется проверять его на ненулевое значение. Во-вторых, указатели могут указывать на различные объекты, а ссылка всегда на один объект, заданный при ее инициализации. Ниже приведен пример использования ссылки.

{ A a("aaaaa",3),aa("bbbb",7);

A &b=a; // ссылка на объект класса А инициализирована значением а

cout <<"адрес a="<<&a << " адрес &b= "<< &b << endl;

b=aa; // присвоение значений объекта aa ссылке b (и объекту a)

cout<<"компоненты объекта :"; a.see();

cout<<"компоненты ссылки :"; b.see();

int &ii=i; // ссылка на переменную i типа int

Из примера следует, что переменная и ссылка на нее имеют один и тот же адрес в памяти. Изменение значения по ссылке приводит к изменению значения переменной и наоборот.

Ссылка может также указывать на константу, в этом случае создается временный объект, инициализируемый значением константы.

const int &j=4; // j инициализируется const-значением 4

j++; // ошибка l-value specifies const object

int k=j; // переменная k инициализируется значением

Если тип инициализатора не совпадает с типом ссылки, то могут возникнуть проблемы с преобразованием данных одного типа к другому, например:

double f=2.5;

int &n=(int &)f;

cout<<”f=”<<f<<” n=”<<n; // результат f= 2.5 n=2

Адрес переменной f и ссылки n совпадают, но значения различаются, так как структуры данных плавающего и целочисленного типов различны.

Можно создать ссылку на ссылку, например:

int k=1;

int &n=k; // n – ссылка на k (равно k)

n++; // значение k равно 2

int &nn=n; // nn – ссылка на ссылку n (переменную k)

nn++; // значение k равно 3

Значения адреса переменной k, ссылок n и nn совпадают, следовательно, для ссылки nn не создается временный объект.

На применение переменных ссылочного типа накладываются некоторые ограничения:

- ссылки не являются указателями;

- можно взять ссылку от переменной ссылочного типа;

- можно создать указатель на ссылку;

- нельзя создать массив ссылок;

- ссылки на битовые поля не допускаются.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]