Статические элементы класса
Иногда требуется определить данные, которые относятся ко всем объектам класса. Типичные случаи: требуется контроль общего количества объектов класса или одновременный доступ ко всем объектам или части их, разделение объектами общих ресурсов. Тогда в определение класса могут быть введены статические элементы -переменные. Такой элемент сам в объекты класса не входит, зато при обращении к нему формируется обращение к общей статической переменной с именем
. имя_класса::имя_элемента
Доступность ее определяется стандартным образом в зависимости от размещения в личной или общей части класса. Сама переменная должна быть явно определена в программе и инициализирована:
//------------------------------------------------------bk73-02.cpp
// Все объекты класса dat связаны в односвязный список
//----------------------------------------------------
#include <stdio.h>
class dat
{
int day,month,year;
static dat *fst; // Указатель на первый элемент
dat *next; // Указатель на следующий элемент
public:
void show(); // Просмотр всех объектов
dat(); // Конструктор
~dat(); // Деструктор
};
dat *dat::fst=NULL; // Определение статического элемента
//---------------------------------------------------------
void dat::show()
{
dat *p;
for (p=fst; p !=NULL; p=p->next)
{ /* вывод информации об объекте */ }
}
//------ Конструктор - включение в начало списка --------
dat::dat()
{ /* ... */ next = fst; fst = this; }
//------ Деструктор - поиск и исключение из списка -------
dat::~dat()
{
dat *p; // указатели на текущий и предыдущий
dat *pred; // элементы списка
for ( p=fst,pred=NULL; p !=NULL; pred=p,p = p->next)
if (p = this) break; // Найден - выйти
if (p!=NULL) // Найденный исключить из списка
{
if (pred==NULL) fst=fst->next;
else pred->next=p->next;
}
}
Статическими могут быть объявлены также и функции-элементы. Их "статичность" определяется тем, что вызов их не связан с конкретным объектом и может быть выполнен по полному имени. Соответственно в них не используются неявный указатель на текущий объект this . Они вводятся, как правило, для выполнения действий, относящихся ко всем объектам класса. Для предыдущего примера функция просмотра всех объектов класса может быть статической:
class list
{ ...
static void show(); // Cтaтическая функция просмотра
} // списка объектов
//--------------------------------------------------------
static void list::show()
{
list *p;
for (p=fst; p !=NULL; p=p->next)
{ ...вывод информации об объекте... }
}
//-------------------------------------------------------
void main()
{ ... list::show(); } // Вызов функции по полному имени