Читаем Язык программирования C++. Пятое издание полностью

int ival = 1024;

int &refVal = ival; // refVal ссылается на другое имя, ival

int &refVal2       // ошибка: ссылку следует инициализировать

Обычно при инициализации переменной значение инициализатора копируется в создаваемый объект. При определении ссылки вместо копирования значения инициализатора происходит связывание (bind) ссылки с ее инициализатором. После инициализации ссылка остается связанной с исходным объектом. Нет никакого способа изменить привязку ссылки так, чтобы она ссылалась на другой объект, поэтому ссылки следует инициализировать.

Новый стандарт ввел новый вид ссылки — ссылка r-значения (r-value reference), которую мы рассмотрим в разделе 13.6.1. Эти ссылки предназначены прежде всего для использования в классах. С технической точки зрения, когда мы используем термин ссылка (reference), мы подразумеваем ссылку l-значения (l-value reference).

Ссылка — это псевдоним

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

refVal = 2; // присваивает значение 2 объекту, на который ссылается

            // ссылка refVal, т.е. ival

int ii = refVal; // то же, что и ii = ival

Ссылка — это не объект, а только другое имя уже существующего объекта.

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

// ok: ссылка refVal3 связывается с объектом, с которым связана

// ссылка refVal, т.е. с ival

int &refVal3 = refVal;

// инициализирует i значением объекта, с которым связана ссылка refVal

int i = refVal; // ok: инициализирует i значением ival

Поскольку ссылки не объекты, нельзя определить ссылку на ссылку.

Определение ссылок

В одном определении можно определить несколько ссылок. Каждому являющемуся ссылкой идентификатору должен предшествовать символ &.

int i = 1024, i2 = 2048; // i и i2 — переменные типа int

int &r = i, r2 = i2;     // r — ссылка, связанная с переменной i;

                         // r2 — переменная типа int

int i3 = 1024, &ri = i3; // i3 — переменная типа int;

                         // ri — ссылка, связанная с переменной i3

int &r3 = i3, &r4 = i2;  // r3 и r4 — ссылки

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

int &refVal4 = 10;   // ошибка: инициализатор должен быть объектом

double dval = 3.14;

int &refVal5 = dval; // ошибка: инициализатор должен быть объектом

                     // типа int

Упражнения раздела 2.3.1

Упражнение 2.15. Какие из следующих определений недопустимы (если таковые есть)? Почему?

(a) int ival = 1.01;   (b) int &rval1 = 1.01;

(с) int &rval2 = ival; (d) int &rval3

Упражнение 2.16. Какие из следующих присвоений недопустимы (если таковые есть)? Если они допустимы, объясните, что они делают.

int i = 0, &r1 = i; double d = 0, &r2 = d;

(a) r2 = 3.14159; (b) r2 = r1;

(c) i = r2;       (d) r1 = d;

Упражнение 2.17. Что выводит следующий код?

int i, &ri = i;

i = 5; ri = 10;

std::cout << i << " " << ri << std::endl;

<p><image l:href="#reader.png"/>2.3.2. Указатели</p>
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных