Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Статические поля и методы
Внутри класса можно создать поле или метод, которые будут доступны без создания экземпляра класса. Для этого перед объявлением поля или метода следует указать ключевое слово 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;
}
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов