×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 49 из 714 Настройки

Эта программа выводит значение переменной >ival тремя разными способами: сначала непосредственно, затем через указатель >pi на тип >int и наконец обращением к значению указателя >ppi дважды, чтобы добраться до основного значения в переменной >ival.

Ссылки на указатели

Ссылка — не объект. Следовательно, не может быть указателя на ссылку. Но поскольку указатель — это объект, вполне можно определить ссылку на указатель.

>int i = 42;

>int *p;      // p - указатель на тип int

>int *&r = p; // r - ссылка на указатель p

>r = &i;      // r ссылается на указатель;

>             // присвоение &i ссылке r делает p указателем на i

>*r = 0;      // обращение к значению r дает i, объект, на который

>             // указывает p; изменяет значение i на 0

Проще всего понять тип >r — прочитать определение справа налево. Ближайший символ к имени переменной (в данном случае >& в >&r) непосредственно влияет на тип переменной. Таким образом, становится ясно, что >r является ссылкой. Остальная часть оператора объявления определяет тип, на который ссылается ссылка >r. Следующий символ, в данном случае >*, указывает, что тип r относится к типу указателя. И наконец, базовый тип объявления указывает, что >r — это ссылка на указатель на переменную типа >int.

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

Упражнения раздела 2.3.3

Упражнение 2.25. Определите типы и значения каждой из следующих переменных:

>(a) int* ip, &r = ip; (b) int i, *ip = 0; (c) int* ip, ip2;

2.4. Спецификатор >const

Иногда необходимо определить переменную, значение которой, как известно, не может быть изменено. Например, можно было бы использовать переменную, хранящую размер буфера. Использование переменной облегчит изменение размера буфера, если мы решим, что исходный размер нас не устраивает. С другой стороны, желательно предотвратить непреднамеренное изменение в коде значения этой переменной. Значение этой переменной можно сделать неизменным, используя в ее определении спецификатор>const (qualifier const):

>const int bufSize = 512; // размер буфера ввода

Это определит переменную >bufSize как константу. Любая попытка присвоить ей значение будет ошибкой:

>bufSize = 512; // ошибка: попытка записи в константный объект

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

>const int i = get_size(); // ok: инициализация во время выполнения

>const int j = 42;         // ok: инициализация во время компиляции

>const int k;              // ошибка: k - неинициализированная константа

Инициализация и константы

Как уже упоминалось не раз, тип объекта определяет операции, которые можно с ним выполнять. Константный тип можно использовать для большинства, но не для всех операций, как и его неконстантный аналог. Ограничение одно — можно использовать только те операции, которые неспособны изменить объект. Например, тип >const int можно использовать в арифметических выражениях точно так же, как обычный неконстантный тип