Определяя класс в тексте программы, мы создаем новый тип данных, состоящий из полей и составных функций, объединенных в структуру. Объектом класса называется переменная этого типа. Объект отличается от класса тем, что он занимает некоторую область памяти, тогда как класс описывает структуру полей, составляющих эту область. Поля двух различных объектов класса не связаны между собой. Чтобы получить область, которая является общей для всех объектов класса, достаточно описать поля этой области с атрибутом static: . Описанные таким образом поля называются статическими. Более точно, статическими называются элементы класса, которые являются общими для всех объектов этого класса.
Пример. Определим класс строки, содержащий подпрограмму, возвращающую количество объектов этого класса, находящихся в области видимости. Определим статическую переменную many целого типа. Конструктор объекта будет увеличивать эту переменную на 1, а деструктор – уменьшать на 1. Распределение области памяти, занимаемой объектами класса, приведено на рис. 2.1.
Int many |
- поле, содержащееся в каждом объекте |
|||
Объект char *s int length |
Объект char *s int length |
· · · |
Объект char *s int length |
- поля объектов, содержащие указатели на строки и длины строк |
Приведём текст программы:
#include <iostream.h>
#include <conio.h>
#include <string.h>
class Vstring
{
// Закрытые элементы
static int many; // Количество объектов Vstring
char *s; // Строка
int length; // Длина строки
public: // Общедоступные элементы
Vstring(char *text) // Конструктор
{
length = strlen(text); // Вычисление длины
s = new char[length+1]; // Выделение памяти
strcpy(s, text); // Копирование строки
many++; // Увеличение числа объектов
}
~Vstring() // Деструктор
{
delete s; // Освобождение памяти
many—; // Уменьшение числа объектов
}
static int Number() { return many; } // Статическая функция
// Общая функция
void get()
{
cout << s << ‘n';
}
};
int Vstring::many = 0; // Установка начального числа объектов
void main()
{
clrscr(); // Очистка экрана
cout << "Количество объектов Vstring: " << Vstring::Number() << ‘n';
Vstring u("12345");
cout << "Количество объектов Vstring: " << Vstring::Number() << ‘n';
Vstring v("12345");
cout << "Количество объектов Vstring: " << Vstring::Number() << ‘n';
cout << "Значение объекта v: ";
v.get();
cout << ‘n';
for(int i = 0; i < 3; i++)
{
cout<<"Количество объектов Vstring: "<<Vstring::Number()<<‘n';
Vstring v("12345");
cout<<"Количество объектов Vstring: "<<Vstring::Number()<<‘n';
getch();
}
}
Результаты работы программы
Количество объектов Vstring: 0
Количество объектов Vstring: 1
Количество объектов Vstring: 2
Значение объекта v: 12345
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Количество объектов Vstring: 2
Количество объектов Vstring: 3
Количество объектов Vstring: 2
Количество объектов Vstring: 3