Статические поля и методы

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

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

Листинг 13.11. Подсчет количества созданных экземпляров класса

#include <iostream>

class C {
public:
   static int count;  // Объявление статического поля
   C() {              // Конструктор
      ++count;        // Обращение к статическому полю внутри класса
   }
   ~C() { --count; }  // Деструктор
};

int C::count;         // Определение статического поля
// int C::count = 12; // Можно сразу присвоить значение

void func() {
   C obj3;
   std::cout << C::count << std::endl; // 3
}

int main() {
   C::count = 0;      // Обращение к статическому полю вне класса
   C obj1;
   std::cout << C::count << std::endl; // 1
   C obj2;
   std::cout << C::count << std::endl; // 2
   func();
   std::cout << C::count << std::endl; // 2
   return 0;
}

К статическому полю можно также получить доступ через экземпляр класса с помощью оператора «точка» (или оператора -> при доступе через указатель):

C obj;
std::cout << obj.count << std::endl;
C *p = &obj;
std::cout << p->count << std::endl;

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

Листинг 13.12. Использование статических методов

#include <iostream>

class C {
public:
   static int sum1(int x, int y) { // Статический метод
      return x + y;
   }
   int sum2(int x, int y) {        // Обычный метод
      return sum1(x, y); // Вызов статического метода внутри класса
   }
};

int main() {
   C obj;
   // Вызов статического метода вне класса
   std::cout << C::sum1(10, 20) << std::endl;  // 30
   // Вызов обычного метода
   std::cout << obj.sum2(20, 5) << std::endl;  // 25
   // Вызов статического метода через экземпляр класса
   std::cout << obj.sum1(30, 10) << std::endl; // 40
   // Вызов статического метода через указатель
   C *p = &obj;
   std::cout << p->sum1(40, 8) << std::endl;   // 48
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов