ProgrammierungC++ Backend Entwickler

Erzählen Sie von der Arbeit mit `static`-Mitgliedern (Variablen und Funktionen) in einer Klasse. Wie werden `static`-Mitglieder initialisiert, welche Schwierigkeiten treten bei ihrer Definition und Verwendung auf, und womit unterscheiden sich `static`-Mitglieder von normalen Mitgliedern einer Klasse?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

static-Mitglieder einer Klasse existieren in einer einzigen Instanz für die gesamte Klasse und haben einen gemeinsamen Wert für alle Objekte.

  • static-Variablen werden außerhalb der Klasse initialisiert, normalerweise in einer cpp-Datei, außerhalb der Klasse (int Foo::count = 0;). Innerhalb der Klasse erklären wir und definieren außerhalb.
  • static-Funktionen können sowohl über die Klasse als auch über Objekte aufgerufen werden. Sie haben keinen Zugriff auf die Mitglieder einer bestimmten Instanz (this) und können nur auf andere static-Mitglieder zugreifen.

Beispielcode

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 }

Fangfrage

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


Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


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.