Der implizit-definierte Fehlkonstruktor in C++ (Der implizit-definierte Fehlkonstruktor in C++), Lektion, Seite 722554
https://www.purl.org/stefan_ram/pub/impliziter_fehlkonstruktor_c++ (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

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

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722554 stefan_ram:722554 Der implizit-definierte Fehlkonstruktor in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722554, slrprddef722554, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/impliziter_fehlkonstruktor_c++