W C++ klasy mogą mieć członków statycznych i niestatycznych (zmienne i funkcje). Powstały, aby wspierać dane ogólne (dla wszystkich obiektów klasy), a także funkcje, które nie wymagają dostępu do stanu konkretnego egzemplarza.
Ważne jest, aby rozróżnić członków statycznych i niestatycznych, ponieważ mają różne cykle życia, zasięgi i zasady inicjalizacji. Częste błędy obejmują: niewłaściwe definiowanie, jednoczesne użycie członków egzemplarza i statycznych, powtarzające się definicje w nagłówkach.
Statyczne zmienne klasy deklaruje się wewnątrz klasy jako static, ale muszą być zdefiniowane osobno poza klasą (do C++17). Istnieją w jednej instancji. Statyczne funkcje nie mają dostępu do niestatycznych (egzemplarzowych) członków bez wyraźnego wskazania.
Przykład kodu:
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
Kluczowe cechy:
Czy można zainicjować statyczną zmienną klasy bezpośrednio w klasie (do C++17)?
Nie, do C++17 dla statycznego członka trzeba dać definicję poza klasą. W C++17 i wyżej dla inline static możliwa jest definicja bezpośrednio w klasie.
// C++17 class Foo { inline static int counter = 0; };
Czy funkcja statyczna klasy ma dostęp do this lub niestatycznych członków?
Nie, członkowie static nie mają dostępu do niestatycznych członków ani this, nawet jeśli stworzone są instancje klasy. Aby się odwołać, należy wyraźnie przekazać obiekt.
Czy członek statyczny klasy zostanie utworzony przy każdym egzemplarzu klasy?
Nie, członkowie static istnieją w jednej instancji dla całej klasy niezależnie od liczby obiektów.
Programista deklaruje static int w klasie, ale nie definiuje jej poza klasą. Linker zgłasza błąd undefined symbol, ponieważ człon statyczny nie został zainicjowany.
Zalety:
Wady:
Członek statyczny zadeklarowany w klasie, zdefiniowany poza klasą, używany jako licznik stworzonych obiektów.
Zalety:
Wady: