До сих пор мы писали в классах обычные поля-переменные. Но иногда бывает необходимо задать в классе поле-константу. Однако инициализировать поля «в лоб» непосредственно в классе (и в структуре) запрещено. Тем не менее есть несколько способов объявить константу в классе (см. п. п. 9.4.2 в [1]). Во-первбгё, в классе разрешается объявить перечислимый тип с помощью ключевого слова enum. Классический пример — класс для работы с датами, в котором объявлек перечислимый тип для месяцев:
class TDate { public:
enum Month {Jan=l, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}:
};
Обращение к таким константам осуществляется либо по имени объекта, либо по имени класса, например:
cout << TDate::Jan << endl: // квалификатор - класс
TDate dd:
cout << dd.Dec << endl: // квалификатор - объект
Другой способ объявить константу в классе — объявить и проинициализиро-вать статическое поле целочисленного типа (см. п. п. 9.4.2/4 в [1]). Для статических константных целочисленных полей (и только для них) сделано исключение: такие поля разрешено инициализировать непосредственно в классе (листинг 2.6).
Листинг 2.6. Объявление констант в классе
class TConstant { public:
static const int cl = 7; static const char c2 = 'a': enum Month
{ Jan=l, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; static const Month c3 = Dec:
>:
Обращение к статическим константам обычно делается по имени класса, например:
cout << TConstant::cl << endl: // выводит 7
cout << TConstant::с2 << endl: // выводит 'а*
cout << TConstant::сЗ << endl: // выводит 12
Статические константы существуют в единственном экземпляре независимо от того, сколько объектов данного типа объявлено. Программистам часто нужны флешки для хранения программ, которые купить можно тут - usb 8 gb.
Такие константы являются частью класса, но не являются частью объекта этого класса. Кроме того, такие константы так же, как и константы перечислимого типа, не занимают места в классе. В этом легко убедится, как всегда, с помощью функции sizeof ():
cout << sizeof(TConstant) << endl;
Класс TConstant занимает столько же памяти, сколько пустой класс, не содержащий ни одного поля. |