Глава 9. Описатели и спецификаторы данных________________________211

.COPYRIGHT[0] = 'В'; // ОШИБКА: все символы— постоянные

приведет к ошибке. В этом примере const обманчиво: оно может быть не тем, что вы себе представляете.

С другой стороны, если подставлять спецификатор const между именами типа и переменной, то постоянным будет указатель (он содержит адрес строки), но каждый отдельный символ можно будет изменять. То есть

char *const COPYRIGHT = "by MaxSdep";

означает, что невозможно проделать следующее:

COPYRIGHT = "by Linda Кого"; // ОШИБКА: указатель постоянен

но можно будет менять каждый символ:

COPYRIGHT[7] = 't'; // Правильно: Ой, заменили символ в MaxStep

Опять-таки эффект не совсем тот, которого вы могли ожидать. Если вы хотите, чтобы и указатель, и то, на что он указывает оставались постоянными, то const следует поставить в оба места (третий вариант). Вот, например:

const char *const COPYRIGHT = " by Software Conceptions, Inc";

Теперь значение постоянной всегда будет сохранять свое изначальное значение. Как запомнить эти три варианта "постоянности"? Проведите через ключевое слово const воображаемую линию: все, что находится справа от нее — константа.

const char *COPYRIGHT = "MaxStep";

// Каждый символ в строке неизменен

char *const EDITOR = "Fred Slone";

// Метка неизменна, отдельные символы могут быть изменены

const char *const PUBLISHER = "BHV";

// И указатель, и то, на что он указывает, остаются неизменными

Хотя вам и придется повозиться, осваивая постоянные объекты, но игра стоит свеч. Твердая уверенность в статусе объекта — половина успеха при отладке программы. Константы помогают в этом, уменьшая число неясностей.

Постоянные функции-члены

Снова речь пойдет о классах. Когда упоминаются функции-члены, то имеются в виду элементы классов. Функции-члены могут быть описаны как постоянные. Такое использование ключевого слова const требует его размещения после объявления и определения функции. Продемонстрируем это,