static-Mitglieder einer Klasse existieren in einer einzigen Instanz für die gesamte Klasse und haben einen gemeinsamen Wert für alle Objekte.
int Foo::count = 0;). Innerhalb der Klasse erklären wir und definieren außerhalb.this) und können nur auf andere static-Mitglieder zugreifen.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 }
„Kann die Definition eines
static-Mitglieds in einer Header-Datei sein? Welche Risiken entstehen?“
Antwort: Ja, die Definition (int Foo::value = 0;) innerhalb des Headers ist technisch möglich, aber wenn dieser Header in mehrere Übersetzungseinheiten eingebunden wird, führt dies zu mehrfachen Definitionen, die Linkfehler verursachen. Daher sollten static-Mitglieder nur in einer cpp-Datei definiert werden.
Geschichte
Im Bibliothekscode wurde ein
static-Mitglied direkt in der Header-Datei definiert. Mehrfaches Einbinden führte zu Linkfehlern: „multiple definition of ...“. Nachdem die Definition in eine separate cpp-Datei verschoben wurde, verschwand das Problem.
Geschichte
In einem Bildungsprojekt wurde ein
static-Mitglied deklariert, aber vergessen, es in der externen cpp-Datei zu definieren. Trotz des Fehlens von Fehlern beim Kompilieren der Header trat beim Linken der Fehler unresolved external symbol auf. Es musste das fehlende Definition gesucht und hinzugefügt werden.
Geschichte
In einem großen embedded System wurde die Initialisierung eines
static-Mitglieds mit einem berechneten Wert falsch umgesetzt (es wurde versucht, über einen Ausdruck zu initialisieren, der die Ausführung von Code erforderte). Die Logik wurde in eine separate Initialisierungsfunktion ausgelagert, aber aus Unachtsamkeit wurde vergessen, diese Funktion vor dem ersten Zugriff aufzurufen — das Ergebnis waren nicht initialisierte Variablen und unregelmäßiges Verhalten.