Heim > Backend-Entwicklung > C++ > Warum kann ein privater Standardkonstruktor implizit in C aufgerufen werden?

Warum kann ein privater Standardkonstruktor implizit in C aufgerufen werden?

Susan Sarandon
Freigeben: 2024-11-12 04:30:02
Original
1019 Leute haben es durchsucht

Why Can a Private Default Constructor Be Implicitly Invoked in C  ?

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage