Программирование >>  Инициализация объектов класса, структура 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 395


do something();

errorHandler();

*curErr = 0; правильно: обнулим значение errNum if ( *curErr ) {

Попытка присвоить значение константному указателю вызовет ошибку компиляции:

curErr = SmyErNumb; ошибка

Константный указатель на константу является объединением двух рассмотренных

const double pi = 3.14159;

случаев.

const double *const pi ptr = π

Ни значение объекта, на который указывает pi ptr, ни значение самого указателя не может быть изменено в программе.

Упражнение 3.16

(a) int i; (d) int *const cpi;

(b) const int ic; (e) const int *const cpic;

Объясните значение следующих пяти определений. Есть ли среди них ошибочные?

i (c) const int *pic; Упражнение 3.17

(a) int i = -1;

(b) const int ic = i;

(c) const int *pic = Sic;

(d) int *const cpi = Sic;

Какие из приведенных определений правильны? Почему?

i (e) const int *const cpic = Sic;

Упражнение 3.18

Используя определения из нред1дущего упражнения, укажите правильные операторы

(a) i = ic; (d) pic = cpic;

(b) pic = Sic; (i) cpic = ⁣

присваивания. Объясните.

i (c) cpi = pic; (f) ic = *cpic;



int ival = 1024;

правильно: refVal - сс1лка на ival int &refVal = ival;

ошибка: сс1лка должна быть инициазирована

переменной. Ссылка должна быть инициализирована. Например:

int &refVal2;

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

int ival = 1024;

ошибка: refVal имеет тип int, а не int* int &refVal = &ival;

int *pi = &ival;

правильно: ptrVal - сс1лка на указатель

указатель:

int *&ptrVal2 = pi;

Определив ссылку, вы уже не сможете изменить ее так, чтобы работать с другим объектом (именно поэтому ссылка должна быть инициализирована в месте своего определения). В следующем примере оператор присваивания не меняет значения refVal,

int min val = 0;

ival получает значение min val,

а не refVal меняет значение на min val

новое значение присваивается переменной ival - ту, которую адресует refVal.

refVal = min val;

Все операции со ссылками реально воздействуют на адресуемые ими объекты. В том числе и операция взятия адреса. Например:

refVal += 2;

3.6. Ссылочный тип

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

Ссылочный тип обозначается указанием оператора взятия адреса (&) перед именем



одна сс1лка

определено два объекта типа int int ival = 1024, ival2 = 2048;

/ / определена одна сс1лка и один объект int Srval = ival, rval2 = ival2;

определен один объект, один указатель и int inal3 = 1024, *pi = ival3, Sri = ival3;

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

для указателей). Например:

int &rval3 = ival3, &rval4 = ival2;

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

double dval = 3.14159;

верно только для константн сс1лок const int Sir = 1024; const int &ir2 = dval;

безадресной величиной - такой, как литеральная константа. Например:

const double Sdr = dval + 1.0;

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

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

double dval = 1024; вспомогательный. Например, если мы пишем:

const int Sri = dval; то компилятор преобразует это примерно так:

прибавляет 2 к ival - неременной, на которую ссылается refVal. Аналогично

int ii = refVal; присваивает ii текущее значение ival,

int *pi = SrefVal;

инициализирует pi адресом ival.

Если мы определяем ссылки в одной инструкции через запятую, перед каждым объектом типа ссылки должен стоять амперсанд (S) - оператор взятия адреса (точно так же, как и



1 ... 31 32 33 [ 34 ] 35 36 37 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика