В реальных С++ программах ссылки редко используются как самостоятельные объекты, обычно они употребляются в качестве формальных параметров функций. Например:
// пример использования ссылок
// Значение возвращается в параметре next_value
bool get_next_value( int next_value );
// перегруженный оператор
Matrix operator+( const Matrix, const Matrix );
Как соотносятся самостоятельные объекты-ссылки и ссылки-параметры? Если мы пишем:
int ival;
while (get_next_value( ival )) ...
это равносильно следующему определению ссылки внутри функции:
int next_value = ival;
(Подробнее использование ссылок в качестве формальных параметров функций рассматривается в главе 7.)
Есть ли ошибки в данных определениях? Поясните. Как бы вы их исправили?
(a) int ival = 1.01; (b) int rval1 = 1.01;
(c) int rval2 = ival; (d) int rval3 = ival;
(e) int *pi = ival; (f) int rval4 = pi;
(g) int rval5 = pi*; (h) int *prval1 = pi;
(i) const int ival2 = 1; (j) const int *prval2 = ival;
Если ли среди нижеследующих операций присваивания ошибочные (используются определения из предыдущего упражнения)?
(a) rval1 = 3.14159;
(b) prval1 = prval2;
(c) prval2 = rval1;
(d) *prval2 = ival2;
Найдите ошибки в приведенных инструкциях:
(a) int ival = 0;
const int *pi = 0;
const int ri = 0;
(b) pi = ival;
ri = ival;
pi = rval;
3.7. Тип bool
Объект типа bool может принимать одно из двух значений: true и false. Например:
// инициализация строки
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, мы нашли слово\n";
else cout "нет, наше слово не встретилось.\n";
Хотя bool относится к одному из целых типов, он не может быть объявлен как signed, unsigned, short или long, поэтому приведенное определение ошибочно:
// ошибка
short bool found = false;
Объекты типа bool неявно преобразуются в тип int. Значение true превращается в 1, а false – в 0. Например:
bool found = false;
int occurrence_count = 0;
while ( /* mumble */ )
{
found = look_for( /* something */ );
// значение found преобразуется в 0 или 1
occurrence_count += found;
}
Таким же образом значения целых типов и указателей могут быть преобразованы в значения типа bool. При этом 0 интерпретируется как false, а все остальное как true:
// возвращает количество вхождений
extern int find( const string );
bool found = false;
if ( found = find( "rosebud" ))
// правильно: found == true
// возвращает указатель на элемент
extern int* find( int value );
if ( found = find( 1024 ))
// правильно: found == true
3.8. Перечисления
Нередко приходится определять переменную, которая принимает значения из некоего набора. Скажем, файл открывают в любом из трех режимов: для чтения, для записи, для добавления.
Конечно, можно определить три константы для обозначения этих режимов:
const int input = 1;
const int output = 2;
const int append = 3;
и пользоваться этими константами:
bool open_file( string file_name, int open_mode);
// ...
open_file( "Phoenix_and_the_Crane", append );
Подобное решение допустимо, но не вполне приемлемо, поскольку мы не можем гарантировать, что аргумент, передаваемый в функцию open_file() равен только 1, 2 или 3.
Использование перечислимого типа решает данную проблему. Когда мы пишем: