Константы в С++ можно задавать двумя способами:
· с помощью директивы препроцессора #define. Например, строка
#define MILL 1000
задает символическое имя MILL для константы 1000. Препроцессор всюду в тексте заменяет это имя на константу 1000, используя текстовую подстановку. Но есть один нюанс - отсутствует контроль типов, а это потенциальный источник ошибок;
· с ключевого слова const. Например, вместо #define можно использовать следующее описание:
const int MILL = 1000;
Модификатор const означает, что переменная MILL является константой, т.е. менять ее значение нельзя. Попытка присвоить новое значение константе приведет к ошибке компиляции:
MILL = 100; // Ошибка: константу нельзя изменять
При описании указателя модификатор const, записанный до звездочки, означает, что описан указатель на константный объект, т.е. на объект, менять который нельзя или запрещено. Например, в строке
const char *p;
описан указатель на константную строку (массив символов, менять который запрещено).
Указатели на константные объекты используются в С очень часто. Причина состоит в том, что константный указатель позволяет прочесть объект и при этом гарантирует, что объект не будет изменён из-за ошибки программирования, т.к. константный указатель не дает возможности изменить объект.
Константный указатель ссылается на константный объект, однако, содержимое самого указателя может изменяться. Например, следующий фрагмент вполне корректен:
const char *str = "e2e4";
. . .
str = "c7c5";
Здесь константный указатель str сначала содержит адрес константной строки "e2e4". Затем в него записывается адрес другой константной строки "c7c5".
В С можно также описать указатель, значение которого не может быть изменено; для этого модификатор const указывается после звездочки. Например, фрагмент кода
int i;
int * const p = &i;
на века записывает в указатель p адрес переменной i, перенаправить указатель p на другую переменную уже нельзя. Строка
p = &n;
является ошибкой, т.к. указатель p - константа, а константе нельзя присвоить новое значение. Указатели, значения которых изменять нельзя, используются в С значительно реже, в основном при заполнении константных таблиц.