Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

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

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

Статические данные-элементы имеют область действия класс. Они могут быть открытыми, защищенными, закрытыми. Им можно задать начальные значения один (и только один) раз в области действия файл.

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

Статические функции-элементы имеют доступ только к статическим данным-элементам класса.

При наличии объектов доступ к открытому статическому элементу – через имя объекта (указателя, ссылки), к закрытым и защищенным статическим данным-элементам – через функции-элементы этого класса и друзей класса.

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

//----------------------------------------------------------------------------------------------

#include <iostream.h>

#include <string.h>

#include <assert.h>

class employee {

public:

employee(const char*);

~ employee();

const char* getf() const; //возвращает фамилию

static int getcount(); //статическая функция-элемент, возвра-

// щает число действующих объектов

private:

char* f;

static int count; //статический элемент данных (число

//действующих объектов)

};

//----------------------------------------------------------------------------------------------

//Задание начального значения статическому элементу данных в области

//действия файл

int employee::count=0;

//----------------------------------------------------------------------------------------------

int employee::getcount() {return count;}

//----------------------------------------------------------------------------------------------

//Конструктор

employee:: employee(const char* fm)

{ f=new char[strlen(fm)+1];

assert(f!=0);

strcpy(f,fm);

++count; //увеличение статического счетчика служащих

cout<<”Конструктор для “<<f<<”вызван”<<endl;

}

//----------------------------------------------------------------------------------------------

//Деструктор

employee::~ employee()

{ cout<<”Деструктор для “<<f<<”вызван”<<endl;

delete[]f;

--count; //уменьшение статического счетчика служащих

}

//----------------------------------------------------------------------------------------------

// const перед char* предотвращает изменение клиентом класса

// закрытых данных

const char* employee::getf() const

{ return f; }

//----------------------------------------------------------------------------------------------

void main()

{ cout<<”Количество служащих перед созданием объектов: ”

<< employee::getcount()<<endl; //0

employee* e1=new employee(“Иванов”); //Конструктор для Иванов

//вызван

employee* e2=new employee(“Петров”); //Конструктор для Петров

//вызван

cout<<”Количество служащих после создания объектов: ”

<<e1->getcount()<<endl; //2

cout<<”Служащий 1: ”<<e1->getf()<<endl; // Иванов

cout<<”Служащий 2: ”<<e2->getf()<<endl; // Петров

delete e1; //Деструктор для Иванов вызван

delete e2 //Деструктор для Петров вызван

cout<<”Количество служащих после удаления объектов: ”

<< employee::getcount()<<endl; //0

}

//----------------------------------------------------------------------------------------------

Элемент данных count служит для подсчета количества создаваемых и разрушаемых объектов.

Если объекты существуют, count может быть вызван любой функцией-элементом (в том числе как конструктором, так и деструктором). Если объектов нет, - то посредством вызова статической функции-элемента: employee::getcount(). Если есть, то: e1->getcount(). Функция-элемент getcount() определяет число объектов.

Примечание. В отличие от нестатических функций-элементов, статическая функция-элемент не имеет указателя this, потому что статические элементы существуют независимо от каких-либо объектов класса.