R Справочное руководство по С++

R.8.4.3 Ссылки.

   


Назад  |  Вперёд

Переменная, описанная как T&, т.е. "ссылка на тип T" ($$R.8.2.2), должна инициализироваться объектом типа T или объектом, который можно преобразовать к типу T, например,

           void f()
           {
             int i;
             int& r = i;  // `r' ссылается на `i'
             r = 1;       // `i' принимает значение 1
             int* p = &r; // `p' указывает на `i'
             int& rr = r; // `rr' ссылается на то, на что ссылалось `r',
                          //  т.е. на `i'
           };

Ссылку после инициализации нельзя изменять так, чтобы она обозначала другой объект. Отметим, что инициализация ссылки трактуется совсем не так, как присваивание ссылке. Передача параметра ($$R.5.2.2) и операция возврата значения функции ($$R.6.6.3) считаются инициализацией.

Инициализатор для ссылки можно опускать только в описании параметра ($$R.8.2.5), в описании возвращаемого функцией типа, в описании члена класса при описании самого класса ($$R.9.2) и там, где явно использована спецификация extern, например,

           int& r1;        // ошибка: нет инициализации
           extern int& r2; // нормально

Если инициализатор для ссылки на тип T является адресом типа T или типом, производным от T ($$R.10), для которого T служит доступным базовым типом ($$R.4.6), ссылка будет обозначать значение, заданное инициализатором. Иначе, в том и только том случае, когда ссылка обозначает объект со спецификацией const, будет создан объект типа T и проинициализирован значением, заданным инициализатором. Теперь ссылка играет роль имени этого объекта, например,

           double d = 1.0;

           double& rd = d;        // rd ссылается на `d'
           const double& rcd = d; // rcd ссылается на `d'

           double& rd2 = 1;       // ошибка: несоответствие типа
           const double& rcd2 = 1;// rcd2 ссылается на временный объект
                                  // со значением `1'

Ссылку на volatile T можно инициализировать объектом типа volatile T или просто T, но не const T. Ссылку на const T можно инициализировать const T, просто T или чем-то, что можно преобразовать в тип T, но не volatile T. Ссылку на тип T (без const или volatile) можно инициализировать только объектом типа T.

Время жизни временного объекта, созданного при описанной инициализации, определяется текущей областью видимости, в которой он был создан ($$R.3.5). Отметим, что ссылку на класс B можно инициализировать объектом класса D при условии, что В является однозначно определенным и доступным базовым классом для D (тогда говорят, что "D есть B"), см. $$R.4.7.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.