Człony static klasy istnieją w jednym egzemplarzu dla całej klasy, wspólnej dla wszystkich obiektów wartości.
int Foo::count = 0;). Wewnątrz klasy deklarujemy, a definiujemy na zewnątrz.this), mogą odwoływać się tylko do innych członów statycznych.class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }
„Czy definicja członu statycznego może być wewnątrz pliku nagłówkowego? Jakie ryzyko się z tym wiąże?”
Odpowiedź: Tak, definicja (int Foo::value = 0;) wewnątrz nagłówka jest technicznie możliwa, ale jeśli ten nagłówek będzie dołączany w wielu jednostkach tłumaczenia, doprowadzi to do duplikacji (multiple definition), co spowoduje błędy linkowania. Dlatego człony statyczne powinny być definiowane tylko w jednym pliku cpp.
Historia
W kodzie bibliotecznym człon statyczny został zdefiniowany bezpośrednio w pliku nagłówkowym. Wielokrotne dołączenie spowodowało błędy linkowania: "multiple definition of ...". Po przeniesieniu definicji do osobnego pliku cpp problem zniknął.
Historia
W projekcie edukacyjnym człon statyczny został zadeklarowany, ale zapomniano go zdefiniować w zewnętrznym pliku cpp. Mimo braku błędów przy kompilacji nagłówków, przy linkowaniu wystąpił błąd unresolved external symbol. Konieczne było wyszukiwanie i dodawanie brakującej definicji.
Historia
_W dużym systemie embedded niewłaściwie zrealizowano inicjalizację członu statycznego z obliczaną wartością (próbowano zainicjować przez wyrażenie wymagające wykonania kodu). Wyodrębniono logikę do osobnej funkcji inicjalizującej, ale przez nieuwagę zapomniano wywołać tę funkcję przed pierwszym dostępem — wynikiem były nieinicjalizowane zmienne i erratic behavior.