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




Некоторые элементы класса могут быть объявлены с модификатором класса памяти 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).

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: