Переменные — члены класса можно объявлять как статические (static).
Используя статические переменные-члены, можнорешить несколько непростых проблем.
Если вы объявляете переменную статической, то может существовать только одна копия этой переменной — независимо от того,сколько объектов данного класса создается. Каждый объект просто использует (совместно с другими) эту одну переменную. Для обычных переменных-членов при создании каждого объекта создается их новая копия, и доступ к каждой копии возможен только через этот объект. Для обычных переменных каждый объект обладает собственными копиями переменных. А копия статической переменной — только одна, и все объекты класса используют её совместно.
Кроме этого, одна и та же статическая переменная будет использоваться всеми классами, производными от класса, в котором эта статическая переменная содержится.
При объявлении статического атрибута необходимо обеспечить для него глобальное определение вне класса. Это необходимо для того, чтобы под статический атрибут была выделена память, причём только один раз. Это делается путем нового объявления статической переменной, причем используется оператор области видимости для того, чтобы идентифицировать тот класс, к которому принадлежит переменная.
Основной смысл поддержки в C++ статических переменных-членов состоит в том, что благодаря им отпадает необходимость в использовании глобальных переменных.
Поскольку статическая переменная — член класса существует ещё до создания объекта этого класса, доступ к ней в программе может быть реализован без всякого объекта:
Почему при доступе к A::counter из main() в последнем случае мы получим ошибку компиляции?
Атрибут counter описан в защищённой части класса.
Для доступа к такой переменной можно передвинуть её в зону public, но лучше сделать публичным статический метод для доступа к ней.
Статическими можно объявлять и методы. При этом такой метод не может обращаться к не статическим полям данного класса и не имеет в себе определённым указатель this, так как вызывается независимо от экземпляра.
Статические методы могут оказаться удобными для предварительной инициализации закрытых статических атрибутов до создания экземпляровили просто независимо от доступа к ним: