Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
63
Добавлен:
16.02.2016
Размер:
196.61 Кб
Скачать

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

Члены класса могут быть объявлены с модификатором static. Статический член класса может рассматриваться как глобальная переменная или функция, доступная только в преде­лах области класса.

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

Например:

class AnyClass

{

public:

AnyClass();

//объявление статического данного-члена

static int count;

};

//определение статического данного-члена

int AnyClass::count = 0;

Заметим, что хотя к статическим данным-членам, объявлен­ным в разделе public класса, можно обращаться с помощью конструкции, использующих имя объекта:

<объект>.<данное-_член>

или

<указатель_на_объект> - > <данное_член>,

лучше использовать форму вызова

<имя_класса>: : <данное -_член>,

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

применяйте статически данные-члены для совместного использования данных несколькими объектами класса;

ограничьте доступ к статическим данным-членам, объя­вив их в разделе protected или private.

Рассмотрим пример использования статического данного-члена класса:

#include <iostream.h>

class T

{

public:

T(){ObCount++;}

~T(){ObCount--;}

static int ObCount;

//...

private:

int x;

};

int Т::ObCount = 0;

int main()

{

T* pOb = new Т[5];

cout « " Имеется " « Т::ObCount « " объектов типа Т\n";

delete[] рОb;

return 0;

}

В этом примере статическое данное-член просто ведет учет созданных объектов. При выполнении программа выводит на экран:

Имеется 5 объектов типа Т

Особенностью использования статических функций-членов является то, что они также определены в единственном экземпля­ре и не являются безраздельной собственностью какого-то пред­ставителя класса. В связи с этим им не передается указатель this. Эта особенность статических функций-членов использует­ся при написании функций-обработчиков прерывании и callback-функций (при программировании для Windows).

Из сказанного выше вытекает несколько важных следствий:

статическая функция-член может вызываться независимо от того, существует или нет какой-либо представитель класса;

статическая функция-член может манипулировать только статическими данными-членами класса и вызывать толь­ко другие статические функции-члены класса;

статическая функция-член не может быть объявлена с модификатором virtual.

Приведем пример использования статической функции-члена. Он представляет собой слегка отредактированный предыдущий пример:

#include <iostream.h>

class T

{

public:

Т(){ObCount++;}

~Т(){ObCount--;}

//...

static int GetCounts(){return ObCount;}

private:

int x;

static int ObCount;

};

int Т::ObCount = 0;

int main ()

{

Т* рОb = new Т[5] ;// Динамическое выделение памяти для 5 объектов типа Т

cout « "Имеется " « Т::GetCounts() « " объектов типа Т\n";

delete[] pOb; // удаление памяти, выделенной для группы объектов

return 0;

}

Соседние файлы в папке ЛекцииКарасева