static leden van een klasse bestaan in één exemplaar voor de hele klasse, een waarde die gemeenschappelijk is voor alle objecten.
int Foo::count = 0;). Binnen de klasse verklaren we het, maar definiëren we het buiten.this), en kunnen alleen naar andere static leden verwijzen.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 }
"Kan de definitie van een static lid binnen een headerbestand staan? Welke risico's zijn er?"
Antwoord: Ja, de definitie (int Foo::value = 0;) binnen de header is technisch mogelijk, maar als deze header in meerdere translation units wordt opgenomen, leidt dit tot duplicatie (multiple definition), wat linker fouten zal veroorzaken. Daarom moeten static leden alleen in één cpp-bestand worden gedefinieerd.
Verhaal
In de bibliotheekcode was een static lid gedefinieerd direct in het headerbestand. Meerdere inclusies leidden tot linkerfouten: "multiple definition of ...". Nadat de definitie naar een apart cpp-bestand was verplaatst, verdween het probleem.
Verhaal
In een educatief project was een static lid verklaard, maar men vergat het te definiëren in het externe cpp-bestand. Ondanks het ontbreken van fouten bij het compileren van de headers, kwam er een unresolved external symbol fout tijdens het linken. Het was nodig om de ontbrekende definitie te zoeken en toe te voegen.
Verhaal
_In een groot embedded systeem werd de initialisatie van een static lid met een berekend waarde verkeerd geïmplementeerd (men probeerde te initialiseren via een expressie die code-uitvoering vereiste). De logica werd in een aparte init-functie geplaatst, maar men vergat deze functie te roepen voordat er de eerste toegang was — het resultaat waren niet-geinitialiseerde variabelen en erratic gedrag.