ProgrammatieC++ backend ontwikkelaar

Vertel over het werk van static leden (variabelen en functies) in een klasse. Hoe worden static leden geïnitialiseerd, welke moeilijkheden ontstaan er bij hun definitie en gebruik, en hoe verschillen static leden van gewone leden van de klasse?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

static leden van een klasse bestaan in één exemplaar voor de hele klasse, een waarde die gemeenschappelijk is voor alle objecten.

  • static variabelen worden buiten de klasse geïnitialiseerd, meestal in een cpp-bestand, buiten de klasse (int Foo::count = 0;). Binnen de klasse verklaren we het, maar definiëren we het buiten.
  • static functies kunnen zowel via de klasse als via een object worden aangeroepen. Ze hebben geen toegang tot leden van een specifiek exemplaar (this), en kunnen alleen naar andere static leden verwijzen.

Voorbeeldcode

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 }

Strikvraag

"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.


Voorbeelden van echte fouten door onwetendheid over de nuances van het onderwerp.


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.