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;).
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) {} };
„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.
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.