ProgrammierungC++ Entwickler

Wie funktioniert der Standardkonstruktor (default constructor) in C++? Was passiert, wenn kein Konstruktor in der Klasse deklariert wird, und auch wenn andere Konstruktoren deklariert werden, aber der Standardkonstruktor nicht?

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

Antwort

In C++ ist der Standardkonstruktor ein Konstruktor ohne Parameter oder mit Parametern, bei denen alle Standardwerte haben. Wenn in der Klasse kein Konstruktor deklariert ist, generiert der Compiler automatisch einen public Standardkonstruktor. Wenn jedoch mindestens ein anderer Konstruktor (z.B. ein Konstruktor mit Parametern) deklariert wird, wird der automatisch vom Compiler bereitgestellte Standardkonstruktor nicht generiert. Sollte in einer solchen Klasse ein Standardkonstruktor benötigt werden, muss dieser explizit deklariert werden (z. B. mit ClassName() = default;).

Beispielcode

class Foo { public: Foo(int x) {} // Benutzerdefinierter Konstruktor // Foo() wird nicht automatisch vom Compiler generiert! }; Foo f; // Kompilierungsfehler – kein Standardkonstruktor!

Um in diesem Fall explizit einen Standardkonstruktor zu erstellen, sollte Folgendes hinzugefügt werden:

class Foo { public: Foo() = default; Foo(int x) {} };

Fangfrage

„Wenn Sie nur einen Konstruktor mit Parametern haben, können Sie dann Objekte dieser Klasse ohne Parameter erstellen? Warum?“

Antwort: Nein! Denn wenn irgendein Konstruktor deklariert ist, fügt der Compiler keinen Standardkonstruktor automatisch hinzu. Um Objekte ohne Parameter zu erstellen, muss der Standardkonstruktor explizit in der Deklaration hinzugefügt werden.


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


Geschichte

In einem großen Projekt wurde eine Klassenhierarchie für die Serialisierung von Daten geschrieben, in der alle „untergeordneten“ Klassen nur spezifische Konstruktoren mit Parametern hatten. Nach der Refaktorisierung stellte sich heraus, dass beim Verwenden von STL-Containern (z.B. std::vector) mit diesen Klassen die Kompilierung fehlschlug: Der Container benötigte einen Standardkonstruktor, der nicht vorhanden war. Das Problem wurde erst durch die explizite Deklaration des Standardkonstruktors gelöst.


Geschichte

In einem Projekt, das Templates verwendet, deklarierte eine der Adapterklassen nur den Konstruktor mit Parametern zur Übergabe von Ressourcen. Dabei verlangte eine der Bibliotheken die Existenz eines Standardkonstruktors für korrektes Funktionieren (durch die Erstellung temporärer Objekte über Templates). Es traten mysteriöse Linkfehler auf, die lange nicht erklärt werden konnten, bis der explizite Standardkonstruktor realisiert wurde.


Geschichte

Im Code gab es Migrationen von C++98 auf C++11, und der Versuch, „= default“ zur expliziten Deklaration des Standardkonstruktors zu verwenden. In alten Compilern traten Fehler auf oder neue Syntaxkonstruktionen wurden ignoriert. Dies zeigte, dass nicht alle Entwickler den Unterschied zwischen einem explizit implementierten Standardkonstruktor, einem vom Compiler erzeugten und der neuen Syntax „= default“ verstehen.