Статические данные-члены класса — КиберПедия 

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

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

2017-05-23 403
Статические данные-члены класса 0.00 из 5.00 0 оценок
Заказать работу

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

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

Пример 5.

class Any

{

public:

Any ();

static int count;

};

int Any:: count =0;

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

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

Эта форма обращения отражает тот факт, что соответствующее данное-член является единственным для всего класса.

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

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

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

Пример 6.

Файл Dot.h

class Dot

{

static int count;// объявление статического данного-члена – счётчика объектов

char name;

int x, y;

public:

Dot (char Name) { name = Name; x =0; y =0; count ++;}

~ Dot () { count --;}

void PrintCount (); // функция выводит количество существующих объектов

};

Файл Dot.cpp

#include " Dot. h "

void Dot:: PrintCount ()

{

char S [30];

CharToOem ("В памяти существует ", S);

cout << S << count;

CharToOem (" объекта типа Dot\n", S);

cout << S;

}

Файл Main.cpp

#include " Dot. h "

int Dot:: count =0; // инициализация статического данного-члена

int main ()

{

Dot A ('A'), B ('B'), C ('C');

A. PrintCount ();

cout << Dot:: count <<'\n'; // ошибка: данное-член count недоступен

}

В этом примере статическое данное-член count содержит количество существующих объектов. Инициализация данного-члена count осуществляется перед выполнением программы и созданием объектов в файле основной программы с помощью оператора: void Dot:: PrintCount ()

Обратите внимание, что обращение к этому члену класса в функции main () в операторе cout << Dot:: count <<'\n'; приводит к ошибке, поскольку данное-член класса count объявлено как закрытое и является недоступным за пределами класса.

При выполнении программа выводит на экран:

В памяти существует 3 объекта типа Dot

Корректный учёт количества существующих объектов достигается двумя действиями: каждый конструктор, (в том числе и конструктор копирования) увеличивает счётчик на единицу, деструктор – уменьшает на единицу. Поскольку конструктор вызывается при создании каждого объекта, а деструктор – при уничтожении, то данное-член count будет содержать количество существующих объектов независимо от того каким образом и в какой области определения создан или уничтожен объект.

Статические функции-члены класса

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

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

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

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

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

Пример 7.

Файл Dot.h

class Dot

{

int x, y;

static int count;

public:

Dot () { x =0; y =0; count ++;}

~ Dot () { count --;}

static int GetCount () { return count;}

void PrintCount ();

};

Файл Dot.cpp

#include " Dot. h "

void Dot:: PrintCount ()

{

char T [30];

CharToOem ("В памяти существует ", T);

cout << T << count;

CharToOem (" объекта типа Dot\n", T);

cout << T;

}

Файл Main.cpp

#include " Dot. h "

int Dot:: count =0; // инициализация статического данного-члена

int main ()

{

char S [25];

CharToOem ("Сейчас есть объектов: ", S);

cout <<S<< Dot:: GetCount ()<<'\n';

Dot A, B, C;

A. PrintCount ();

cout << Dot:: GetCount ()<<'\n';

}


Поделиться с друзьями:

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.01 с.