Информатика и технология программирования

       

Статические элементы класса


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


. имя_класса::имя_элемента

Доступность ее определяется стандартным образом в зависимости от размещения в личной или общей части класса. Сама переменная должна быть явно определена в программе и инициализирована:


//------------------------------------------------------bk73-02.cpp


// Все объекты класса dat связаны в односвязный список


//----------------------------------------------------


&#35include &#60stdio.h&#62
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-&#62next)
{ /* вывод информации об объекте */ }
}
//------ Конструктор - включение в начало списка --------


dat::dat()
{ /* ... */ next = fst; fst = this; }
//------ Деструктор - поиск и исключение из списка -------


dat::~dat()
{
dat *p; // указатели на текущий и предыдущий


dat *pred; // элементы списка


for ( p=fst,pred=NULL; p !=NULL; pred=p,p = p-&#62next)
if (p = this) break; // Найден - выйти


if (p!=NULL) // Найденный исключить из списка


{
if (pred==NULL) fst=fst-&#62next;
else pred-&#62next=p-&#62next;
}
}

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


class list
{ ...
static void show(); // Cтaтическая функция просмотра


} // списка объектов


//--------------------------------------------------------


static void list::show()
{
list *p;
for (p=fst; p !=NULL; p=p-&#62next)
{ ...вывод информации об объекте... }
}
//-------------------------------------------------------


void main()
{ ... list::show(); } // Вызов функции по полному имени



Содержание раздела