Heim > Artikel > Backend-Entwicklung > Warum verhindert ein privater Standardkonstruktor die Objekterstellung in C, die geklammerte Initialisierung funktioniert jedoch?
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:
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!