Урок 7.1.7. Ссылки

7.1.7. Ссылки

В языке С++ введен тип данных, которого нет в С, – ссылка. Ссылка позволяет определить еще одно имя для переменной, синоним (eng. alias).

Формат объявления ссылки выглядит следующим образом:

<тип> &<идентификатор1> = <идентификатор2>;

Ссылка при объявлении всегда должна быть проинициализирована, после этого её нельзя будет изменить. Например:

int c, a, b = 5;
int &ref_a = a;  //ref_a является ссылкой на a
ref_a = b; // a = b, т.е. a = 5
ref_a++;   // a = 6, ref_a = 6;
c = ref_a;  // c = 6;

int *p = &ref_a; // p инициализируется  адресом a
int &ir = 1024;   // ошибка: не адрес, только ссылка на постоянный объект
// может быть проинициализирована таким значением как 1024
const int &ir = 1024;   // верно: ссылка на константный объект
const int &ar = a + b;  // верно: ссылка на константный объект
int const &ar = a;         // const (константная ссылка) здесь избыточно,
// т.к. ссылка и так не может меняться

double d[10];
double &rd9 = d[9]; // имя(псевдоним) элемента d[9]

Ссылку можно рассматривать как постоянный указатель, который всегда разадресован и для которого не надо выполнять операцию разадресации (*).

Подчеркнем, что ссылка не создает копии объекта, а является именем объекта. Т.е. выражение &ref_a == &a всегда истинно.

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

1. При объявлении ссылки на константу. При этом создается внутренняя переменная, ей присваивается константа, а затем ссылка инициализируется этой переменной.

Например, есть объявление:

char &ref = ‘\0’;

компилятор создаст код:

char temp = ‘\0’;
char &ref = temp;

Это делается по соображениям безопасности. Компилятор оптимизирует размещение одинаковых констант, размещая их одной области памяти. Поэтому выполнение кода:

char &ref = ‘\0’;
ref = ‘\t’;
char n = ‘\0’;

могло бы привести к тому, что переменная n получила бы значение ‘\t’. Более того, ‘\0’ в программе была бы заменена на ‘\t’.

2. При инициализации ссылки переменной другого типа. Например, объявление:

unsigned int ui = 77;
int &r_ui = ui;

интерпретируется следующим образом:

int t = (int)ui;
int &r_ui = t;

Когда при объявлении ссылки создается копия объекта во временной памяти, компилятор выдает соответствующее предупреждение. В случае выдачи сообщения об ошибке положение можно исправить следующим образом:

const int &r_ui = ui; //ссылку на константный объект можно объявить
//и при несовпадении типов.

Основной причиной введения ссылок в C++ явилась необходимость передачи параметров в функции через ссылку и получения возвращаемого значения виде ссылки при реализации перегружаемых операций. Операции применяются  к объектам пользовательских типов (классов). Передача по значению объектов, возможно больших, в качестве операндов вызовет лишние затраты на их копирование. Кроме того, передача операндов с использованием указателей, приводит к необходимости взятия адресов операндов в выражениях.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов