Der implizit definierte Fehlkonstruktor in C++
Bei fehlendem Initialisierer wird ein Objekt fehlinitialisiert. Wir hatten bereits eine Fehlinitialisierung eines Exemplars verwendet.
main.cpp
#include <iostream>
#include <ostream>
#include <string>struct entity { ::std::string string; };
int main()
{ ::entity entity;
::std::cout << '"' << entity.string << '"' << '\n'; }::std::cout
""
Bei einer Fehlinitialisierung wird ein zu einer leeren Argumentliste passender Konstruktor des Objekts aufgerufen, um das Objekt zu initialisieren.
Wir hatten Konstruktoren bereits bei der Behandlung vordefinierte Klassen kennengelernt.
Die C++ -Implementation hat zu der obigen Klasse einen Konstruktor hinzugefügt, ohne daß dies im Quelltext irgendwo ausdrücklich verlangt werden mußte.
Ein Konstruktor, der ohne eine Entsprechung im Quelltext hinzugefügt wird, wird auch impliziert-definierter Konstruktor genannt. (Die Bezeichnung „impliziter Konstruktor“ könnte mit einem Konstruktor verwechselt werden, der zu impliziten Typwandlungen herangezogen wird.)
Ein Konstruktor, dessen Parameterliste eine Verwendung ohne Argumente erlaubt, wird auch Fehlkonstruktor genannt, weil er „mit fehlenden Argumenten“ verwendet werden kann.
Unsere Klasse hat also einen Fehlkonstruktor, ohne daß wir dies im Quelltext irgendwo ausdrücklich verlangt hätten, und dieser Fehlkonstruktor wird in dem obigen Programm zur Initialisierung des Objekts verwendet.
- Die Proklamation des implizit definierten Fehlkonstruktors
entity();
Dieser implizit definierte Konstruktor der Klasse wird im obigen Programm dann zur Initialisierung des Exemplars der Klasse »::entity« herangezogen. Er führt dann eine Fehlinitialisierung der Felder durch.
Wir haben jetzt also erklärt, wie es kommt, daß das Feld »string« mit dem Text »« initialisiert wird, obwohl es in dem Programm keine Initialisierer und keine Konstruktordeklarationen gibt.
Wann ist ein Fehlkonstruktor vorgegeben (“defaulted”, also implizit implementationsdefiniert)?
Ein Fehlkonstruktor wird vorgegeben, wenn in der folgenden Tabelle in der Spalte »Fehlkonstruktor« »vorgegeben« steht.
- Tabelle
.- Benutzer Fehl-
| deklariert: konstruktor
|
|
| nichts vorgegeben
|
| Fehlkonstruktor benutzer-
| deklariert
|
'-
In Worten: Wenn der Benutzer einen Fehlkonstruktor deklariert, dann ist der Fehlkonstruktor benutzerdefiniert, sonst ist er vorgegeben.
Zitate
- Bei fehlendem Initialisierer wird ein Objekt fehlinitialisiert.
- “If no initializer is specified for an object, the object is default-initialized. ”, 2015 8.5p12
- Bei einer Fehlinitialisierung wird ein zu einer leeren Argumentliste passender Konstruktor des Objekts aufgerufen, um das Objekt zu initialisieren.
- “The constructor thus selected is called, with an empty argument list, to initialize the object. ”, 2015 9.5p7
- Ein Konstruktor, dessen Parameterliste eine Verwendung ohne Argumente erlaubt, wird auch Fehlkonstruktor genannt, weil er „mit fehlenden Argumenten“ verwendet werden kann.
- “A default constructor for a class X is a constructor of class X that either has no parameters or else each parameter that is not a function parameter pack has a default argument.”, 2015 12.1p4
- Der implizit definierte Fehlkonstruktor führt dann eine Fehlinitialisierung des Felds »string« durch.
- “The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class with no ctor-initializer (12.6.2) and an empty compound-statement.”, 2015 12.1p5
- “The constructor thus selected is called, with an empty argument list, to initialize the object. ”, 2015 9.5p7
- “In a non-delegating constructor ” (9.1) “if the entity is a non-static data member that has a brace-or-equal-initializer« ... »the entity is initialized as specified in 8.5; ”, 2015 12.6.2p9
- “If no initializer is specified for an object, the object is default-initialized. ”, 2015 8.5p12