Лекция: Переменные и операции класса
Обычно для каждого объекта необходима своя копия переменных, описанных в классе. Однако в некоторых ситуациях требуется, чтобы в классе были данные, общие для всех его экземпляров – переменные класса.
Переменная класса в С++ описывается с ключевым словом static, она создается один раз как часть класса, а не для каждого конкретного экземпляра данного класса. Функция, которой требуется доступ к переменным класса, но не требуется, чтобы она вызывалась для конкретного экземпляра класса, также описывается как статическая (static).
Пример. Опишем класс для работы с датами.
class Date{
int day;// день
int month;// месяц
int year;// год
public:
Date (int, int, int); // день, месяц, год
Date (int, int); // день, месяц, текущий год – по умолчанию
Date (int); // день, текущие месяц и год – по умолчанию
Date ( ); // дата по умолчанию – сегодня
.. .
};
В данном примере мы объявили четыре конструктора для того, чтобы иметь возможность задавать дату в сокращенном виде. В крупных проектах количество конструкторов, позволяющее учесть различные варианты использования, может быть намного больше.
Рассмотрим альтернативное решение. Опишем конструктор с аргументами по умолчанию.
class Date{
int day, month, year;
static Date default_date;
public:
Date (int d=0, int m=0, int y=0);
.. .
static void set_default(int, int, int);
};
Если значение аргумента является нулевым, следует воспользоваться соответствующим элементом даты, задаваемой по умолчанию – default_date. Поскольку значение default_date должно быть одинаковым для всех объектов класса, данная переменная является статическим членом. Для ее инициализации описана также статическая функция-член set_default. Статические члены – и функции, и данные – должны быть где-то определены. Например,
Date Date :: default_date (1, 1, 2000);
void set_default (int d, int m, int y)
{
Date :: default_date= Date (d, m, y);
}
Статические члены используются также для реализации на языке С++ утилит. Утилитами называют совокупность глобальных переменных и свободных подпрограмм, сгруппированных в форме объявления класса. В этом случае глобальные переменные и свободные подпрограммы рассматриваются как члены класса, причем именно как статические. Введение утилит позволяет приблизить реализацию системы на языке С++ к набору классов и взаимодействующих объектов, как в чисто объектно-ориентированных языках.