Типы данных в языке C++__________________________________723

Для введения в класс подобных данных используются статические данные,
которые содержат информацию «для всего класса». Объявление статических эле-
ментов в классе начинается с ключевого слова static. Например:

static int D;

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

Данные, общие для всех объектов класса, надо объявлять как статические данные - элемен-
ты. Это сократит затраты памяти и гарантирует единство данных во всех объектах.

Статические элементы могут быть открытыми, закрытыми или защищенны-
ми (protected). Доступ к открытым статическим элементам класса возможен по-
средством любого объекта класса или посредством имени класса, с помощью би-
нарной операции разрешения области действия. Например:

MyClass::D = 10;

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

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

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

int MyClass::D = 0;

Предупреждение —-—-•—-——-———————-.—-———-—————————————

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

Приведем пример, демонстрирующий все сказанное относительно статических
данных — элементов:

class MyClass

{

public:

static int D;

static int GetDl(void) ;

private:

static int Dl;

);

int MyClass::GetDl(void) (return Dl;

int MyClass::D = 0;

int MyClass::D1 = 1;