722_____________________________________________Глава 12

то функция IncFA, не являясь элементом данного класса, получает доступ к его за-
крытым элементам. Например, функция IncFA может быть описана где-то в про-
грамме следующим образом:

void IncFAfMyClass *P) (P->FA++;}

Дружественными могут быть не только функции, но и целые классы. Напри-
мер, вы можете поместить в объявление своего класса оператор

friend Classi;

и все функции — элементы класса Classi получат доступ к закрытым элементам
вашего класса.

Иногда программист может захотеть создать объект вашего класса как кон-
стантный с помощью спецификатора const. Например:

const Classi MC1(3) ;

Если при этом ваш класс содержит не только функции чтения, но и записи
данных, то реакция на такой оператор, введенный пользователем, зависит от вер-
сии и настройки компилятора. Компилятор может выдать сообщение об ошибке и
отказаться от компиляции, а может просто выдать предупреждение и проигнори-
ровать спецификатор пользователя const. Если же ваш класс содержит только
функции чтения, то все должно бы быть нормально. Но компилятор подойдет к
этому чисто формально и все равно выдаст предупреждение а может и отказаться
компилировать программу.

Чтобы избежать этого, можно объявить функции чтения как константные.
Для этого и в прототипе, и в реализации после закрывающей список параметров
круглой скобки надо написать спецификатор const. Например, вы можете вклю-
чить в объявление класса оператор

int GetA(void) const;

а реализацию этой функции оформить как:

int MyClass::GetA(void) const (return FA;}
Тогда неприятные замечания компилятора о константных объектах исчезнут.

Хороший стиль программирования —————————————————————————

Если предполагается, что объект вашего класса может быть объявлен константным, снаб-
жайте все функции — элементы класса, предназначенные для чтения данных, спецификато
рами const.

12.13.3 Данные — элементы, статические данные,
константные данные

Теперь рассмотрим несколько подробнее данные — элементы. Обычно каждый
объект класса имеет свою собственную копию всех данных-элементов класса. Но в
определенных случаях во всех объектах класса должна фигурировать только ОДНЕ
копия некоторых данных. Например, это может быть счетчик числа созданных
объектов класса.

Единственную копию данных полезно иметь и во многих иных случаях. На-
пример, если в классе имеются некоторые константы, одинаковые для всех объек-
тов класса, то нерационально хранить в каждом объекте собственные копии этих
констант. Рациональнее иметь единственные экземпляры этих констант для всех
объектов.