In-Class-Datenelement-Initialisierungsanomalie: Eintauchen in den C-Standard
Im Gegensatz zu lokalen Datenelementen, die direkt mit () initialisiert werden können Aufgrund der Syntax widersprechen klasseninterne Datenelemente dieser praktischen Methode. Diese Besonderheit hat viele Programmierer verwirrt und Fragen nach der zugrunde liegenden Begründung aufgeworfen.
Gemäß dem C-Standard ist die direkte Initialisierung von Klassendatenmitgliedern mit () verboten, um Mehrdeutigkeiten beim Parsen zu verhindern. Stellen Sie sich das folgende Szenario vor:
class S { public: int i(x); // data member with initializer };
Ohne die Einschränkung könnte der Compiler verwirrt sein, wenn er feststellen möchte, ob sich die Deklaration auf ein Datenelement mit einem Initialisierer oder eine Elementfunktionsdeklaration bezieht.
Zum Beispiel:
struct S { int i(j); // member function declaration int j; // data member without an initializer };
Die Anwendung der bestehenden Parsing-Regel, die Elementfunktionen gegenüber Datenelementen in mehrdeutigen Situationen Vorrang einräumt, könnte zu falschen Interpretationen führen. Um solche Verwirrung zu vermeiden, hat sich der C-Standard dafür entschieden, die direkte Initialisierung von Klassendatenmitgliedern nicht zuzulassen.
Trotzdem sind weiterhin alternative Initialisierungsmethoden verfügbar, wie zum Beispiel die Verwendung der = initializer-clause-Syntax:
int s = 3;
Oder die in geschweifte Klammern eingeschlossene Initialisierungsliste:
int s{3};
Durch die Einhaltung dieser Methoden können Programmierer Klassendatenelemente effektiv initialisieren, wenn auch mit einer anderen Syntax als ihre lokalen Gegenstücke.
Das obige ist der detaillierte Inhalt vonWarum können wir in C keine Klammern verwenden, um klasseninterne Datenelemente zu initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!