Кратко

  • Статические члены класса (static) - это переменные и функции, которые принадлежат самому классу, а не его экземплярам. Это значит, что все экземпляры класса разделяют одни и те же статические члены. Объявляются с static, инициализируются вне класса.
  • Статические функции-члены: Могут вызываться без создания экземпляра класса, объявляются с static.
  • Применение: Подсчет объектов, глобальные настройки, общие ресурсы.

Подробнее

Статические переменные-члены

Статическая переменная-член объявляется внутри класса с использованием ключевого слова static и инициализируется вне класса.

class MyClass {
public:
    static int staticData; // Объявление статической переменной-члена
};
 
// Определение и инициализация статической переменной-члена
int MyClass::staticData = 0;
 
int main() {
    MyClass obj1;
    MyClass obj2;
 
    // Доступ к статической переменной через объект или класс
    obj1.staticData = 5;
    std::cout << MyClass::staticData << std::endl; // 5
    std::cout << obj2.staticData << std::endl; // 5
 
    return 0;
}

Статические функции-члены

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

class MyClass {
public:
    static void staticFunction() {
        std::cout << "Static function called" << std::endl;
    }
};
 
int main() {
    // Вызов статической функции через класс
    MyClass::staticFunction();
 
    // Вызов статической функции через объект
    MyClass obj;
    obj.staticFunction();
 
    return 0;
}

Примеры использования

  1. Подсчет количества созданных объектов:
class Counter {
public:
    static int count; // Статическая переменная для подсчета объектов
 
    Counter() {
        count++;
    }
 
    ~Counter() {
        count--;
    }
 
    static int getCount() {
        return count;
    }
};
 
int Counter::count = 0;
 
int main() {
    Counter obj1;
    Counter obj2;
 
    std::cout << "Number of objects: " << Counter::getCount() << std::endl; // 2
 
    {
        Counter obj3;
        std::cout << "Number of objects: " << Counter::getCount() << std::endl; // 3
    }
 
    std::cout << "Number of objects: " << Counter::getCount() << std::endl; // 2
 
    return 0;
}
  1. Глобальные настройки для всех экземпляров:
class Settings {
public:
    static int globalSetting;
 
    static void setGlobalSetting(int value) {
        globalSetting = value;
    }
 
    static int getGlobalSetting() {
        return globalSetting;
    }
};
 
int Settings::globalSetting = 0;
 
int main() {
    Settings::setGlobalSetting(10);
    std::cout << "Global setting: " << Settings::getGlobalSetting() << std::endl; // 10
 
    return 0;
}