274 ___________________Часть II. Программирование на C++
Строка 25 провоцирует предупреждение о вызове непостоянной функции-члена для постоянного объекта. Предупреждение выдается в Окне сообщений (Message window) в Borland C++ 5 IDE (рис. 9.3).
Еще о consf
Спецификатор const нужен во многих ситуациях. В предыдущем разделе было показано, как функции-члены (см. главу 14 "Базовые концепции классов") могут быть объявлены постоянными. Глава 15 "Перегрузка функций" и глава 1-6 "Перегрузка операций" рассматривают перегрузку функций и операций. Спецификатор const является перегружаемым. Это значит, что функции, операции и т. п. могут быть перегружены в своей постоянности (или отсутствии таковой).
Ключевое слово const может быть использовано при приведении типов, как это показано в главе 23 "Динамическая идентификация типов". Классы могут обладать постоянными элементами, но они обязаны быть проинициали-зированы. Все константы должны инициализироваться в момент описания, если только не являются ссылками.
В этой книге уже упоминалось, что C++ — язык нетривиальный. Как и языки, на которых мы разговариваем, он сложен в грамматике и в нюансах. Изучение и использование C++ и удовольствие, и трудная задача. Существует мнение, что наше мышление ограничивается разговорным языком. C++ очень выразителен. Это является одним из его достоинств, другое же скрыто в его почти детской простоте: для "общения" не надо учить его весь. "Красноречие" приходит с практикой и опытом.
enum
Язык С позволяет использовать символические константы с помощью директивы препроцессора #define. Многие справедливо полагают, что гораздо проще изменять или ссылаться на имя константы, чем на некие постоянные числа, рассыпанные по программе. Напрямую постоянную можно задать следующим образом:
const int BLACK = 0;
const int BLUE = 1;
const int GREEN =2; // константы цветов RGB
или по-другому:
const int BLACK = 0;
const int BLUE = BLACK +1; // То же самое, но сделано иначе
При таком подходе возникают две проблемы. Во-первых, это довольно утомительно и требует ввода массы текста, во-вторых, константы нельзя инициализировать в классе (мы еще вернемся ко второму примеру).