Глава 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 требует его размещения после объявления и определения функции. Продемонстрируем это,