Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verhindert ein privater Standardkonstruktor die Objekterstellung in C, die geklammerte Initialisierung funktioniert jedoch?

Warum verhindert ein privater Standardkonstruktor die Objekterstellung in C, die geklammerte Initialisierung funktioniert jedoch?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-12 20:39:02725Durchsuche

Why Does a Private Default Constructor Prevent Object Creation in C   But Braced Initialization Works?

Wann ist ein privater Konstruktor kein privater Konstruktor?

In C scheint es eine einfache Möglichkeit zu sein, einen Konstruktor privat zu machen, um die Objekterstellung zu verhindern außerhalb der Klasse. Allerdings tritt unerwartetes Verhalten auf, wenn ein Standardkonstruktor als privat deklariert wird.

Bedenken Sie den folgenden Code:

class C {
    C() = default;
};

int main() {
    C c; // Error: Private constructor
    auto c2 = C(); // Error: Private constructor
}

Überraschenderweise schlägt die Kompilierung dieses Codes aufgrund des privaten Standardkonstruktors fehl. Der folgende Code:

class C {
    C() = default;
};

int main() {
    C c{}; // Compiles
    auto c2 = C{}; // Compiles
}

wird jedoch erfolgreich kompiliert.

Der Grund für dieses eigenartige Verhalten liegt im C-Standard. Gemäß 8.4.2/5 [dcl.fct.def.default] wird eine Funktion nicht vom Benutzer bereitgestellt, wenn sie bei ihrer ersten Deklaration explizit als Standard angegeben wird. Daher wird in unserem ersten Beispiel der Standardkonstruktor nicht vom Benutzer bereitgestellt.

Dieser Mangel an vom Benutzer bereitgestellten Konstruktoren macht die Klasse C zu einem Aggregat gemäß 8.5.1/1 [dcl.init.aggr], welche:

  • Hat keine vom Benutzer bereitgestellten Konstruktoren
  • Hat keine privaten oder geschützten nicht statischen Datenelemente
  • Hat keine Basisklassen
  • Hat keine virtuellen Funktionen

Für Aggregate wird die geschweifte-init-Syntax als Konstruktoraufruf und nicht als Deklaration betrachtet, weshalb sie im letztgenannten Codeausschnitt erfolgreich ist.

Das obige ist der detaillierte Inhalt vonWarum verhindert ein privater Standardkonstruktor die Objekterstellung in C, die geklammerte Initialisierung funktioniert jedoch?. 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