С++ для начинающих




Ссылочный тип - часть 2


// определено два объекта типа int

int ival = 1024, ival2 = 2048;

// определена одна ссылка и один объект

int &rval = ival, rval2 = ival2;

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

int inal3 = 1024, *pi = ival3, &ri = ival3;

// определены две ссылки

int &rval3 = ival3, &rval4 = ival2;

Константная ссылка может быть инициализирована объектом другого типа (если, конечно, существует возможность преобразования одного типа в другой), а также безадресной величиной – такой, как литеральная константа. Например:

double dval = 3.14159;

// верно только для константных ссылок

const int &ir = 1024;

const int &ir2 = dval;

const double &dr = dval + 1.0;

Если бы мы не указали спецификатор const, все три определения ссылок вызвали бы ошибку компиляции. Однако, причина, по которой компилятор не пропускает таких определений, неясна. Попробуем разобраться.

Для литералов это более или менее понятно: у нас не должно быть возможности косвенно поменять значение литерала, используя указатели или ссылки. Что касается объектов другого типа, то компилятор преобразует исходный объект в некоторый вспомогательный. Например, если мы пишем:

double dval = 1024;

const int &ri = dval;

то компилятор преобразует это примерно так:

int temp = dval;

const int &ri = temp;

Если бы мы могли присвоить новое значение ссылке ri, мы бы реально изменили не dval, а temp. Значение dval осталось бы тем же, что совершенно неочевидно для программиста. Поэтому компилятор запрещает такие действия, и единственная возможность проинициализировать ссылку объектом другого типа – объявить ее как const.

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

const int ival = 1024;

// ошибка: нужна константная ссылка

int *&pi_ref = &ival;

Попытка исправить дело добавлением спецификатора const тоже не проходит:




Содержание  Назад  Вперед