Wann ist ein privater Konstruktor kein privater Konstruktor?
In C scheint die Deklaration eines Standardkonstruktors als privat eine einfache Möglichkeit zu sein, dies zu verhindern Objektinstanziierung. Überraschenderweise kann jedoch immer noch ein privater Standardkonstruktor implizit aufgerufen werden.
Frage:
Bedenken Sie den folgenden Code:
class C { C() = default; }; int main() { C c; // error: default constructor private auto c2 = C(); // error: default constructor private }
Warum? Der Konstruktor scheint privat zu sein, kann aber implizit mit der Klammerinitialisierung aufgerufen werden?
Antwort:
Der Schlüssel liegt in der C 14-Spezifikation. Ein vom Benutzer bereitgestellter Konstruktor ist ein Konstruktor, der explizit deklariert wird, ohne dass er standardmäßig festgelegt oder gelöscht wird. Da der Standardkonstruktor von C bei seiner ersten Deklaration explizit als Standard festgelegt wurde, gilt er nicht als vom Benutzer bereitgestellt.
Aus diesem Grund fehlen in C die vom Benutzer bereitgestellten Konstruktoren und es wird gemäß 8.5.1/1 zu einem Aggregat Spezifikation. Ein Aggregat ist als Klasse ohne private oder geschützte nicht statische Datenelemente, ohne Basisklassen, ohne virtuelle Funktionen und ohne vom Benutzer bereitgestellte Konstruktoren definiert. Dies erklärt, warum die Klammerinitialisierung erfolgreich Objekte von C erstellen kann, obwohl der Standardkonstruktor technisch gesehen privat ist.
Das obige ist der detaillierte Inhalt vonWarum kann ein privater Standardkonstruktor implizit in C aufgerufen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!