После того как ссылка определена, все операции с ней фактически осуществляются с объектом, с которым связана ссылка.
>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.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;
Указатель (pointer) — это составной тип, переменная которого указывает на объект другого типа. Подобно ссылкам, указатели используются для косвенного доступа к другим объектам. В отличие от ссылок, указатель — это настоящий объект. Указатели могут быть присвоены и скопированы; один указатель за время своего существования может указывать на несколько разных объектов. В отличие от ссылки, указатель можно не инициализировать в момент определения. Подобно объектам других встроенных типов, значение неинициализированного указателя, определенного в области видимости блока, неопределенно.