In C++ können Klassen statische und nicht-statische Mitglieder (Variablen und Funktionen) haben. Sie wurden eingeführt, um gemeinsame Daten (für alle Objekte der Klasse) sowie Funktionen, die keinen Zugriff auf den Zustand eines bestimmten Exemplars benötigen, zu unterstützen.
Es ist wichtig, statische und nicht-statische Mitglieder zu unterscheiden, da sie unterschiedliche Lebenszyklen, Sichtbarkeiten und Initialisierungsregeln haben. Häufige Fehler umfassen: falsche Definitionen, gleichzeitige Nutzung von Instanz- und statischen Mitgliedern, mehrfache Definitionen in Header-Dateien.
Statische Klassenvariablen werden innerhalb der Klasse als static deklariert, müssen jedoch separat außerhalb der Klasse definiert werden (vor C++17). Sie existieren in einem einzigen Exemplar. Statische Funktionen haben keinen Zugang zu nicht-statischen (Instanz-)Mitgliedern ohne explizite Angabe.
Beispielcode:
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
Wichtige Merkmale:
Kann man eine statische Klassenvariable direkt innerhalb der Klasse (vor C++17) initialisieren?
Nein, vor C++17 muss für ein statisches Mitglied eine Definition außerhalb der Klasse gegeben werden. In C++17 und höher ist für inline static eine Definition direkt innerhalb der Klasse möglich.
// C++17 class Foo { inline static int counter = 0; };
Hat eine statische Funktion der Klasse Zugriff auf this oder nicht-statische Mitglieder?
Nein, statische Mitglieder haben keinen Zugriff auf nicht-statische Mitglieder oder this, selbst wenn Instanzen der Klasse erstellt werden. Um darauf zuzugreifen, muss das Objekt ausdrücklich übergeben werden.
Wird ein statisches Klassenmitglied bei jeder Instanz der Klasse erstellt?
Nein, statische Mitglieder existieren in einem einzigen Exemplar für die gesamte Klasse unabhängig von der Anzahl der Objekte.
Ein Entwickler erklärt ein static int in der Klasse, definiert es aber nicht außerhalb der Klasse. Der Linker gibt einen Fehler für undefined symbol aus, da das statische Mitglied nicht initialisiert wurde.
Vorteile:
Nachteile:
Das statische Mitglied ist in der Klasse deklariert, außerhalb der Klasse definiert und wird als Zähler für erstellte Objekte verwendet.
Vorteile:
Nachteile: