Некоторые элементы класса могут быть объявлены с модификатором класса памяти static и их называют статическими элементами класса. Эти элементы являются частью класса, но не частью объекта этого класса. Объявление статических элементов-данных не является описанием, то есть под эти данные не выделяется память. Их описание должно быть задано в другом месте программы. Существует ровно одна копия статического элемента-данного, в отличие от обычных элементов, когда каждый объект класса имеет свои независимые элементы. Тем самым все объекты ссылаются на одно и тоже место в памяти. Изменив значение статического элемента в одном объекте, получим изменившееся значение во всех других объектах класса.
Аналогично, функции-элементы класса также могут быть объявлены статическими (static). Таким функциям требуется доступ к элементам класса, но не требуется, чтобы они вызывались для конкретного объекта. Они не получают указатель this, соответственно могут обращаться только к статическим элементам-данным класса посредством операций точка (.) или стрелка (->). Статическая функция-элемент не может быть виртуальной. К статическим элементам (данным и функциям) можно обращаться, даже если не создано ни одного объекта класса, надо только использовать полное имя элемента класса. Если функция f() является статической функцией-членом класса cl, можно вызвать эту функцию: cl::f(). К статическим элементам можно обращаться так же, как и к любым другим элементам класса.
Пример 52.
Рассмотрим программу, в которой демонстрируется использование статических элементов класса для подсчета числа существующих и созданных объектов класса.
#include<iostream.h>
#include<conio.h>
class st
{ static int count1; // статические элементы-данные
static int count2;
public:
static void showcount (); // статическая функция-элемент вывода
st (); // прототип конструктора
~st(); // прототип деструктора
};
st::st () // конструктор
{ cout<<"constructor"<<endl;
count1++; // счетчики объектов
count2++;
}
st::~st () // деструктор
{ cout<<"destructor"<<endl;
count2 --; // уменьшение значения счетчика
}
void st::showcount () // функция вывода значений счетчиков
{ cout << "Create objects: " << count1 << endl; // создано объектов
cout << "Exist objects: " << count2 << endl; // существует объектов
}
int st:: count1; // описание типа статических элементов
int st:: count2; // для выделения памяти
void main () // главная функция
{ clrscr(); // чистка экрана результатов
cout<<"1 show:"<<endl; // 1-й заголовок вывода данных
st::showcount (); // вывод данных счетчиков объектов
st a, b, c, *p; // создание трех объектов и указателя
cout<<"2 show:"<<endl; // 2-й заголовок вывода данных
a.showcount (); // вывод данных счетчиков объектов
{ st x, y, z; // создание объектов во внутреннем блоке
cout<<"3 show:"<<endl; // 3-й заголовок вывода данных
st::showcount (); // вывод данных счетчиков объектов
cout<<"4 show:"<<endl; // 4-й заголовок вывода данных
z.showcount (); // вывод данных счетчиков объектов
} // конец видимости внутреннего блока
p = new st; // создание объекта в динамической памяти
cout<<"5 show:"<<endl; // 5-й заголовок вывода данных
st::showcount (); // вывод данных счетчиков объектов
delete p; // уничтожение динамического объекта
cout<<"6 show:"<<endl; // 6-й заголовок вывода данных
st::showcount (); // вывод данных счетчиков объектов
getch (); // задержка экрана результатов
}
Результаты программы (в колонках):
1 show: 3 show: 5 show:
Create objects: 0 Create objects: 6 Create objects: 7
Exist objects: 0 Exist objects: 6 Exist objects: 4
constructor 4 show: destructor
constructor Create objects: 6 6 show:
constructor Exist objects: 6 Create objects: 7
2 show: destructor Exist objects: 3
Create objects: 3 destructor destructor
Exist objects: 3 destructor destructor
Constructor destructor
constructor
constructor
Комментарии к программе.
С помощью вывода значений счетчиков и действий конструктора и деструктора можно следить за процессом в системе. Следует обратить внимание на то, как влияет на существование объектов наличие внутреннего блока в скобках { }, который является областью видимости объектов x, y, z. Сообщение о них выведено двумя способами: 3 show – полным именем функции вывода и 4 show – из любого объекта (в примере z). Выход за пределы внутреннего блока приводит к автоматическим вызовам деструктора для уничтожения объектов этого блока. Объект, созданный динамически, должен быть уничтожен явно (см. 5 и 6 show).