Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ermöglicht die Verwendung von geschweiften Klammern die Initialisierung einer Klasse mit einem privaten Standardkonstruktor in C?

Warum ermöglicht die Verwendung von geschweiften Klammern die Initialisierung einer Klasse mit einem privaten Standardkonstruktor in C?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-20 03:06:02115Durchsuche

Why Does Using Curly Braces Allow Initialization of a Class with a Private Default Constructor in C  ?

Wenn ein „privater“ Konstruktor in C öffentlich wird

In C schränkt die Deklaration des Standardkonstruktors eines Typs als privat normalerweise dessen Zugänglichkeit ein. In bestimmten Szenarien kann diese Einschränkung jedoch unerwartet umgangen werden.

Betrachten Sie das folgende Beispiel:

class C {
    C() = default;  // Private default constructor
};

int main() {
    C c;  // Error: Constructor is private
    auto c2 = C();  // Error: Constructor is private
}

In diesem Fall schlagen beide Versuche, Instanzen von C zu erstellen, aufgrund des privaten Konstruktors fehl . Überraschenderweise scheint diese Einschränkung aufgehoben zu sein, wenn geschweifte Klammern zur direkten Initialisierung von C verwendet werden:

class C {
    C() = default;
};

int main() {
    C c{};  // Success: Curly braces allow object initialization
    auto c2 = C{};  // Success: Initialization not affected by private constructor
}

Enthüllung des Tricks

Dieses eigenartige Verhalten ist auf die Aggregatinitialisierung von C 14 zurückzuführen Regeln. Gemäß 8.4.2/5 von [dcl.fct.def.default] gilt ein Standardkonstruktor nicht als „vom Benutzer bereitgestellt“, wenn er in seiner ersten Deklaration explizit als Standard angegeben wurde. Da der Standardkonstruktor von C diese Kriterien erfüllt, wird er nicht als vom Benutzer bereitgestellt behandelt.

Folglich erfüllt C die Definition eines Aggregats gemäß 8.5.1/1 von [dcl.init.aggr]: Es hat keine Vom Benutzer bereitgestellte Konstruktoren, private oder geschützte nicht statische Datenelemente, Basisklassen oder virtuelle Funktionen.

Aggregatinitialisierung

Ein Aggregat ist ein spezieller Typ mit vereinfachter Initialisierung Regeln. Geschweifte Klammern bedeuten in diesem Zusammenhang eine Aggregatinitialisierung, die die Erstellung eines Objekts auch mit privaten Konstruktoren ermöglicht. In unserem Fall behandelt der Compiler {} als Initialisierungsliste, umgeht die Einschränkung des privaten Konstruktors und initialisiert C als Aggregat.

Das obige ist der detaillierte Inhalt vonWarum ermöglicht die Verwendung von geschweiften Klammern die Initialisierung einer Klasse mit einem privaten Standardkonstruktor in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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