ProgrammatieBackend ontwikkelaar

Wat zijn statische en niet-statische leden van een klasse in C++? Wat zijn hun kenmerken, manieren van initialisatie en gebruiksregels?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Vraaggeschiedenis

In C++ kunnen klassen statische en niet-statische leden (variabelen en functies) hebben. Ze zijn ontstaan ter ondersteuning van gemeenschappelijke gegevens (voor alle objecten van de klasse) en functies die geen toegang tot de toestand van een specifiek exemplaar vereisen.

Probleem

Het is belangrijk om statische en niet-statische leden te onderscheiden, omdat ze verschillende levenscycli, scopes en initialisatieregels hebben. Veelvoorkomende fouten zijn: onjuiste definities, gelijktijdig gebruik van instance- en statische leden, en dubbele definities in headerbestanden.

Oplossing

Statische variabelen van een klasse worden binnen de klasse als static gedeclareerd, maar moeten afzonderlijk buiten de klasse worden gedefinieerd (tot C++17). Ze bestaan in een enkel exemplaar. Statische functies hebben geen toegang tot niet-statische (instance) leden zonder expliciete vermelding.

Codevoorbeeld:

class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;

Belangrijkste kenmerken:

  • Statische leden delen de toestand tussen alle objecten van de klasse.
  • Statische leden kunnen worden gebruikt zonder een exemplaar van de klasse te maken.
  • Initialisatie van statische variabelen buiten de klasse-definitie (tot C++17).

Misleidende vragen.

Kan een statische variabele van een klasse rechtstreeks binnen de klasse worden geïnitialiseerd (tot C++17)?

Nee, tot C++17 moet een statisch lid buiten de klasse worden gedefinieerd. In C++17 en hoger is inline static mogelijk, en kan het rechtstreeks binnen de klasse worden gedefinieerd.

// C++17 class Foo { inline static int counter = 0; };

Heeft een static-functie van de klasse toegang tot this of niet-statische leden?

Nee, static-leden hebben geen toegang tot niet-statische leden of this, zelfs niet als klasse-exemplaren zijn aangemaakt. Voor toegang moet een object expliciet worden doorgegeven.


Wordt een static-lid van een klasse gemaakt bij elk exemplaar van de klasse?

Nee, static-leden bestaan in een enkel exemplaar voor de hele klasse, ongeacht het aantal objecten.

Typische fouten en antipatterns

  • Statische leden zijn niet buiten de klasse gedefinieerd (in oudere standaarden).
  • Gebruik van statische leden voor het opslaan van gegevens die afhankelijk zijn van elk object.
  • Schending van encapsulatie met globale statische variabelen.

Voorbeeld uit het leven

Negatieve case

Een ontwikkelaar verklaart static int in de klasse, maar definieert deze niet buiten de klasse. De linker geeft een ongedefinieerd symbool-foutmelding, omdat het static-lid niet is geïnitialiseerd.

Voordelen:

  • De compiler klaagt niet over de declaratie.

Nadelen:

  • Koppelingfouten.
  • Mysterieus runtime-fouten, als de variabele vóór initialisatie wordt gebruikt.

Positieve case

Het static-lid is verklaard in de klasse, gedefinieerd buiten de klasse, en wordt gebruikt als een teller voor gemaakte objecten.

Voordelen:

  • Eéntal opslag van toestand.
  • Transparante initialisatie en correcte werking.

Nadelen:

  • Mogelijke race-omstandigheden in een multithreading-omgeving (extra bescherming is nodig).