В C++ классы могут иметь статические и нестатические члены (переменные и функции). Они появились для поддержки общих данных (для всех объектов класса), а также для функций, которым не требуется доступ к состоянию конкретного экземпляра.
Важно различать статические и нестатические члены, так как у них разные жизненные циклы, области видимости и правила инициализации. Частые ошибки включают: неправильное определение, одновременное использование экземплярных и статических членов, повторные определения в заголовках.
Статические переменные класса объявляются внутри класса как static, но должны быть определены отдельно вне класса (до C++17). Они существуют в единственном экземпляре. Статические функции не имеют доступа к нестатическим (экземплярным) членам без явного указания.
Пример кода:
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
Ключевые особенности:
Можно ли инициализировать статическую переменную класса прямо внутри класса (до C++17)?
Нет, до C++17 для статического члена нужно дать определение вне класса. В C++17 и выше для inline static возможно определение прямо внутри класса.
// C++17 class Foo { inline static int counter = 0; };
Имеет ли static-функция класса доступ к this или нестатическим членам?
Нет, static-члены не имеют доступа к нестатическим членам или this, даже если созданы экземпляры класса. Для обращения нужно явно передать объект.
Будет ли static-член класса создан при каждом экземпляре класса?
Нет, static-члены существуют в единственном экземпляре для всего класса независимо от числа объектов.
Разработчик объявляет static int в классе, но не определяет её вне класса. Линковщик выдаёт ошибку undefined symbol, поскольку статик-член не инициализирован.
Плюсы:
Минусы:
Static-член объявлен в классе, определён вне класса, используется как счётчик созданных объектов.
Плюсы:
Минусы: