Программирование >>  Унарные и бинарные операторы 

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


230 Глава 12. Ввод-вывод

Чтобы узнать в нем число 1 234 567, нужно догадаться, что память компьютера храпит числа в обратном порядке, то есть старший ват оказывается последним. Поэтому для правильного восприятия число нужно вывернуть наизнанку : 00 12 D6 87. Подставив его в калькулятор и переведя в десятичное, получим ожидаемое 1 234 567.

ГЛАВА 13 Разное




Константы

... Он был остряк, цветист в словах и любил, как сам выражался, уснастить речь. А уснащивал он речь множеством разных частиц, как-то: судырь ты мой. эдакой какой-нибудь, знаете, понимаете, можете себе представить, опюси-тельно так сказать, некоторым образом , и прочими, которые сыпал он мешками...

Н. В. Гоголь, Мертвые души

Как гоголевский почтмейстер уснащивал речь разными словечками, так и программисты на С++ любят уснащивать программы словом const. Это словечко делает программы более надежными, препятствуя изменению объектов, которые по своему смыслу меняться не должны.

Так, например, объявление const int i-5 говорит о том, что i - константа и попытка присвоить ей другое значение (например, так: i=lO:) будет пресечена компилятором.

Заявить о том, что некий объект не меняется, можно и косвенным образом, через указатель:

int а:

const int *р: указатель на константу

Здесь р - указатель, с помощью которого нельзя менять то, на что он указывает. Например, в следующем фрагменте программы инструкция *р=10 будет отвергнута компилятором на том основании, что этот указатель не может менять переменную а:

int а:

const int *р: указатель на константу

Константы 233

р=&а:

*р=10: Нельзя! р - указатель на константу!

Однако ведь сама переменная объявлена обычным образом, поэтому ее может менять другой указатель, объявленный без словечка const.

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

постоянный указатель

char * const р= Учись хорошо! :

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

Листинг 13.1

#i nclude <iostream>

using namespace std:

int mainO {

char а[]- Тимирязев ;

char Ь[]= Мечников :

char * const p=a:

p[3]=-e-:

p[5]=3*:

р[6]= я:

cout p endl:

p=b: Нельзя, указатель постоянный return 0:

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

В отличие от указателей, постоянную ссылку нет нужды объявлять, потому что она и так постоянная



Знание слова const заставляет по-новому взглянуть на исходные тексты наших программ. Теперь их нужно уснастить словечком const - конечно, там, где это имеет смысл.

Вспомним, например, конструктор копии класса matri X (см. раздел Конструктор копии в главе 7), принимающий ссылку на matrix и создаю1ний копию этого объекта. Очевидно, конструктор копии только читает матрицу и ни в коем случае пе должен ее менять. Значит, его параметр должен быть ссылкой па константу:

matrixCconstant matrix 8.mc){ nrows=mc.rget(): ncols-mc.cgetO: m-new doub1e[nrows*ncols]: for(int i=0:i<nrows:i++) for(int j=0:j<nco1s;j++) put(i.j.rac.get(i.j)):

Ho стоит совершить это благое дело - и компилятор возмутится, потому что обнаружит в конструкторе функции rgetO, cget() и get(), о которых не известно, что они не могут изменять параметр тс. Чтобы успокоить компилятор, нужно объявить эти функ1Н1И как постоянные, ие меняюн1ие да1П1ыс объекта. Для .этого слово const помеп1ается справа от списка параметров функции:

int rget()const{ return nrows: }

После этого подозрителыюсть компилятора обратится уже на функции rgetO, cget() и get() - не меняют ли они элементы данных объекта. Значит, одно слово const способно вызвать лавинообразные изменения в программе, поэтому лучше добавлять его но мере создания функций. Если но смыслу задачи какой-то па-рамет]) постоянен, сообщите об этом компилятору. Если

И навеки связана с одним объемом. А вот ссылка па константу, объявляемая так, как показано ниже, может быть очень полезна:

int i: const &r=i:

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

Листинг 13.2

#include <iostream> using namespace std: int mainO { int a:

const int &b=a: a=3:

cout b end!; 3 b=5: Нельзя! return 0:

Сама переменная a не подозревает , что ссылка считает ее константой. 11ере.ме!П1ую jiciko можно изменить, что и отражает выводимая на экран ссылка. А вот изменить ссылку, раз она ссылается на константу, нельзя.

А теперь немного передохнем и постараемся понять, как же объявляются объекты, указатели и ссылки со словом const. Оказывается, секрет прост: нужно читать объявление в обратном порядке: справа налево. Посмотрим еще раз на объявлеьше:

int * const а:

Читая его справа налево, получим: постоянный (const) указатель (*) на int .

Задача 13.1. Просмотрите все объявления переменных со словом const и убедитесь, что правило чтения справа налево работает.



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

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