Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы ООП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
203 Кб
Скачать
☆
  1. Статические члены класса

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

Для всех объектов, созданных на основе класса, содержащего статический член, существует только одна копия этого члена. Примером такого статического члена является счетчик числа созданных объектов данного класса. Такой счетчик может существовать только в отрыве от всех экземпляров объектов данного класса, в то же время работать с ним обычно приходится одновременно с вызовом обычных методов, например, конструкторов объектов, поэтому описывать счет-чик удобнее именно как элемент класса.

Статическими могут быть не только информационные члены класса, но и его методы . Статический метод не может использовать никакие нестатические члены класса, так как, являясь частью класса, а не объекта, он не имеет неявного пара-метра this. Поскольку статический метод не использует специфического со-держимого конкретного объекта, то обращение к нему может осуществляться не только с использованием идентификатора объекта, но и с использованием иден-тификатора класса:

имя_класса :: имя_функции (фактические_параметры);

Одно из очевидных применений статических методов – манипуляция гло-бальными объектами и статическими полями данных соответствующего класса.

Примечание 1. Статические методы класса не могут вызывать нестатические, так как последние имеют доступ к данным конкретных объектов. Обратное допустимо: не-статические методы могут вызывать статические методы.

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

Примечание 3. Статические методы класса не могут быть виртуальными и кон-стантными (inline–функциями быть могут).

Пример:

#include <iostream> using namespace std;

class X{ X(){} ~X(){}

public:

static X& createX(){

X* x1 = new X;

cout << "X created" << endl; return *x1;

}

static void destroyX(X& x1){ delete &x1;

cout << "X destroyed" << endl;

}

};

int main(){

X& xx1 = X::createX();

. . .

X::destroyX(xx1); return 0;

}

Статические информационные члены класса, даже находящиеся в закрытой области (а это характерно для информационных членов класса в соответствии с принципом инкапсуляции), необходимо объявить дополнительно вне класса (с возможной инициализацией):

тип_переменной имя_класса :: идентификатор = инициализатор;

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

Пример:

class B {

static int i; // статический информационный член

  • класса

public:

static void f(int j){ // статический метод i = j;

}

};

int B::I = 10; // дополнительное внешнее определение

  • статической переменной с

  • инициализацией статического

  • информационного члена класса b.

int main(){ B a;

. . .

B::f(1); // вызов статической функции-члена класса.

. . .

return 0;

}