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; // То же самое, но сделано иначе

При таком подходе возникают две проблемы. Во-первых, это довольно утомительно и требует ввода массы текста, во-вторых, константы нельзя инициализировать в классе (мы еще вернемся ко второму примеру).