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

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


int temp = dval; const int &ri = temp;

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

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

const int ival = 1024; ошибка: нужна константная ссылка

ошибку компиляции:

int *&pi ref = &ival;

const int ival = 1024; все равно ошибка

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

const int *&pi ref = &ival;

В чем причина? Внимательно прочитав определение, мы увидим, что pi ref является ссылкой на константный указатель на объект типа int. А нам нужен неконстантный

const int ival = 1024; правильно

указатель на константный объект, поэтому правильной будет следующая запись:

int *const &piref = &ival;

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

int *pi = 0;

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

const int &ri = 0; означает примерно следующее:



int temp = 0;

const int Sri = temp;

int ival = 1024, ival2 = 2048;

int *pi = Sival, *pi2 = &ival2;

Что касается операции присваивания, то в следующем примере:

pi = pi2;

переменная ival, на которую указывает pi, остается неизменной, а pi получает значение адреса переменной ival2. И pi, и pi2 и теперь указывают на один и тот же объект ival2.

int Sri = ival, &ri2 = ival2;

Если же мы работаем со ссылками:

ri = ri2;

то само значение ival меняется, но ссылка ri по-прежнему адресует ival.

В реальных С++ программах ссылки редко используются как самостоятельные объекты,

/ / пример использования сс1лок

Значение возвращается в параметре next value bool get next value( int Snext value );

перегруженн оператор

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

Matrix operator+( const MatrixS, const MatrixS );

int ival;

Как соотносятся самостоятельные объекты-ссылки и ссылки-параметры? Если мы пишем:

while (get next value( ival )) ...

это равносильно следующему определению ссылки внутри функции:

int &next value = ival;

(Подробнее использование ссылок в качестве формальных параметров функций рассматривается в главе 7.)

Упражнение 3.19



(a) int

(c) int &rval2 =

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

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

(e) int *pi = &ival; (f) int &rval4 = pi;

(g) int &rval5 = pi*; (h) int &*prval1 = pi;

Есть ли ошибки в данных определениях? Поясните. Как бы вы их исправили?

i (i) const int &ival2 = 1; (j) const int &*prval2 = &ival;

Упражнение 3.20

Если ли среди нижеследующих операций присваивания ошибочные (используются

(a) rval1 = 3.14159;

(b) prval1 = prval2;

(c) prval2 = rval1;

определения из пред1дущего упражнения)?

i (d) *prval2 = ival2; Упражнение 3.21

(a) int ival = 0; const int *pi

const

const int *pi = 0; const int &ri = 0;

(b) pi = &ival; ri = &ival;

Найдите ошибки в приведенных инструкциях:

pi = &rval;

3.7. Тип bool

инициализация строки string search word = get word();

инициализация переменной found bool found = false;

string next word; while ( cin >> next word )

if ( next word == search word ) found = true;

...

сокращенная запись: if ( found == true ) if ( found )

cout << ok, наш слово\п ;

Объект типа bool может принимать одно из двух значений: true и false. Например:

else cout << нет, наше слово не встретилось.\n ;

Хотя bool относится к одному из целых типов, он не может быть объявлен как signed, unsigned, short или long, поэтому приведенное определение ошибочно:



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

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