Статичні елементи класу
За допомогою ідентифікатора static можна описати статичні поля та методи класу. Їх можна розглядати як глобальні змінні або функції, які доступні тільки в межах області класу.
Статичні поля
Статичні поля застосовуються для зберігання даних, загальних для всіх об'єктів класу, наприклад, кількості об'єктів або посилання на розділяємий всіма об'єктами ресурс. Ці поля існують для всіх об'єктів класу в єдиному екземплярі, тобто не дублюються. Нижче перераховані особливості статичних полів.
Пам'ять під статичне поле виділяється один раз при його ініціалізації незалежно від числа створених об'єктів (і навіть при їх відсутності) і ініціалізується за допомогою операції доступу до області дії, а не операції вибору (визначення повинне бути записано поза функціями):
class A{
public:
static int count; // Оголошення в класі
}:
int А::count; // Визначення в глобальній області
// За замовчуванням ініціалізується нулем
// int А::count = 10; Приклад ініціалізації довільним значенням
Статичні поля доступні як через ім'я класу, так і через ім'я об'єкту:
А *а, b;
...
cout << A::ccount << a->count << b.count;
// Буде виведене одне і те ж
На статичні поля розповсюджується дія специфікаторів доступу, тому статичні поля, описані як private, не можна змінити за допомогою операції доступу до області дії. Це можна зробити тільки за допомогою статичних методів.
Пам'ять, яку займає статичне поле, не враховується при визначенні розміру об'єкту за допомогою операції sizeof.
Статичні методи
Статичні методи призначені для звернення до статичних полів класу. Вони можуть звертатися безпосередньо тільки до статичних полів і викликати тільки інші статичні методи класу, тому що їм не передається прихований покажчик this. Звернення до статичних методів робиться так само, як до статичних полів — або через ім'я класу, або, якщо хоча б один об'єкт класу вже створений, через ім'я об'єкту.
class A
{
static int count; // Поле count - приховане
public:
static void inc_count()
{
count++;
}
};
А::int count; // Визначення в глобальній області
void f()
{
А а;
// a.count++ - не можна, поле count приховане
// Зміна поля за допомогою статичного методу: a.inc_count();
// або А::inc_count();
}
Статичні методи не можуть бути константними (const) і віртуальними (virtual).