Статические компоненты класса: назначение, особенности и примеры использования

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

static тип имя_статического_компонентного_данного;

Ключевое слово static определяет компонент статическим. Основное свойство статического компонентного данного заключается в том, что память под него выделяется единственный раз в программе, причем еще до определения объектов данного класса. Для выделения памяти под статический элемент данных класса необходимо вне класса на внешнем уровне программы поместить инициализатор статического компонента вида

тип имя_класса:: имя_статического_компонентного_данного=выражение;

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

При создании объектов класса память под статический элемент данных не выделяется, все объекты работают с единственным статическим компонентом. Обращаться к статическому компоненту класса можно как к обычному компоненту через имя уже существующего объекта, словно он является частью этого объекта. При этом необходимо учитывать, что, обращаясь к компонентному данному через имя одного объекта, мы изменяем его значение и для всех остальных объектов того же класса.

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

имя_класса:: имя_статического_компонентного_данного

Такой способ используется для изменения значения статического члена данных в тот момент, когда недоступен ни один из объектов класса.

Необходимо также отметить, что на статические компоненты класса действуют ограничения по области видимости, задаваемые ключевыми словами public, protected и private в теле класса.

В приведенном ниже листинге 12 статическое компонентное данное count будет подсчитывать количество созданных экземпляров класса. В конструкторе при создании каждого нового объекта значение count будет увеличиваться на 1, а в деструкторе – уменьшаться на 1 при уничтожении объекта.

//Листинг 12. Статические компоненты класса

class MyClass

{ public:

//определяем статический компонент

static int count;

MyClass()

{

count++;

…}

~MyClass()

{ count--;

}

};

//инициализация статического компонента

int MyClass::count=0;

main()

{

MyClass c1();

MyClass *c2=new MyClass();

cout<<MyClass::count; //вывод числа 2

//допустимо и cout<<c1.count;

}

Статическими можно объявить и методы класса. В связи с тем, что методы класса, как уже упоминалось, и так существуют в памяти в единственном экземпляре, не множась для каждого созданного объекта, смысл объявления статического метода в классе может быть лишь один – он должен работать со статическими компонентными данными. Статический метод может быть вызван вне контекста объекта:

имя_класса:: имя_статического_метода (список_фактических_парамет-

ров)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: