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

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

Пример. Определим класс строки, содержащий подпрограмму, возвращающую количество объектов этого класса, находящихся в области видимости. Определим статическую переменную many целого типа. Конструктор объекта будет увеличивать эту переменную на 1, а деструктор – уменьшать на 1. Распределение области памяти, занимаемой объектами класса, приведено на рис. 2.1.

Int many

- поле, содержащееся в каждом объекте

Объект

char *s

int

length

Объект

char *s

int

length

· · ·

Объект

char *s

int

length

- поля объектов, содержащие указатели на строки и длины строк

Подпись: Рис. 2.1. Распределение области памяти

Приведём текст программы:

#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