Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

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

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

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

class Stat {

private:

static int count; // общее поле для всех объектов

public:

Stat() { count++; } // инкрементирование при создании объекта

int getcount() { return count; }

};

int Stat::count = 0; // определение count необходимо делать именно вне класса

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

int main() {

Stat f1, f2, f3; //создание тр¸х объектов

cout << "Chislo ob'ektov: " << f1.getcount() << endl;

cout << "Chislo ob'ektov: " << f2.getcount() << endl;

cout << "Chislo ob'ektov: " << f3.getcount() << endl;

getch(); return 0;

}

В этом примере конструктор класса при создании объекта класса будет инкрементировать значение поля count. В главной функции мы определяем три объекта класса Stat. Вопрос: Сколько раз происходит инкрементирование поля count, и каков будет вывод программы? Ответ: Поскольку конструктор в этом случае вызывается трижды, инкрементирование поля count также происходит трижды. Метод getcount() возвращает значение count. Метод вызывается для каждого из объектов, и во всех случаях он возвращает одну и ту же величину: 3 (если бы мы использовали не статическое, а автоматическое поле count, то конструктор увеличивал бы на единицу значение этого поля для каждого объекта, и результатом вывода программы была бы 1).

Рассмотрим теперь строку: int Stat::count = 0;. Определение статических полей класса происходит не так, как для обычных полей. Обычные поля объявляются и определяются при помощи одного оператора. Для статических полей эти два действия выполняются двумя разными операторами: объявление поля находится внутри определения класса, а определение поля, как правило, располагается вне класса и зачастую представляет собой определение глобальной переменной. Помещая определение статического поля вне класса, мы обеспечиваем однократное выделение памяти под это поле до того, как программа будет запущена на выполнение и статическое поле в этом случае станет доступным всему классу.