|
Программирование >> Инициализация объектов класса, структура
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, поэтому приведенное определение ошибочно:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |