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.
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.
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:
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.
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:
Nadelen:
Het static-lid is verklaard in de klasse, gedefinieerd buiten de klasse, en wordt gebruikt als een teller voor gemaakte objecten.
Voordelen:
Nadelen: