Programmierer fragen sich möglicherweise, warum Klassendatenelementen keine Werte mithilfe der direkten Initialisierungssyntax zugewiesen werden können, ähnlich wie bei lokalen Variablen können. Betrachten Sie das folgende Beispiel:
class test { public: void fun() { int a(3); std::cout << a << '\n'; } private: int s(3); // Compiler error: Why??? };
Beim Kompilieren dieses Codes treten Fehler auf:
11 9 [Error] expected identifier before numeric constant 11 9 [Error] expected ',' or '...' before numeric constant
Warum passiert das? Sehen wir uns die Haltung des C-Standards zur Initialisierung von Klassendatenelementen an.
Frühe Vorschläge für die direkte Initialisierungssyntax erklärten, dass sie ausgeschlossen wurde, um Parsing-Problemen vorzubeugen. Betrachten Sie beispielsweise den folgenden Code:
struct S { int i(x); // data member with initializer // ... static int x; }; struct T { int i(x); // member function declaration // ... typedef int x; };
Wenn eine direkte Initialisierung zulässig wäre, würde das Parsen der Deklaration von Struktur S mehrdeutig werden. Der Compiler könnte int i(x); entweder als Datenmember mit einem Initialisierer oder als Member-Funktionsdeklaration mit einem Parameter.
Eine Lösung besteht darin, sich auf die Regel zu verlassen, dass eine Deklaration sowohl als als auch interpretiert werden kann Wenn es sich um ein Objekt und eine Funktion handelt, sollte es als Funktion behandelt werden. Diese Regel existiert jedoch bereits für blockbezogene Deklarationen, was zu potenzieller Verwirrung führt:
struct S { int i(j); // ill-formed...parsed as a member function, // type j looked up but not found // ... static int j; };
Eine andere Lösung besteht darin, die Regel zu verwenden, dass eine Deklaration, wenn sie sowohl als Typ als auch als etwas anderes interpretiert werden kann, dies auch tun sollte als Letzteres behandelt werden. Auch hier gilt diese Regel bereits für Vorlagen:
struct S { int i(x); // unabmiguously a data member int j(typename y); // unabmiguously a member function };
Allerdings führen beide Lösungen Feinheiten ein, die zu Missverständnissen führen können.
Um diese Unklarheiten zu beseitigen, Der C-Standard schlug vor, nur Initialisierer der folgenden Formen zuzulassen:
Dies löst in den meisten Fällen die Mehrdeutigkeit und vermeidet die Notwendigkeit zusätzlicher Regeln.
Zusammenfassend lässt sich sagen, dass das Verbot von Die direkte Initialisierungssyntax für Klassendatenmember in C ergibt sich aus Parsing-Mehrdeutigkeiten, die bei der Deklaration komplexer Datenstrukturen auftreten können, die sowohl Datenmember als auch Funktionsdeklarationen oder Typdefinitionen umfassen mit ähnlichen Signaturen.
Das obige ist der detaillierte Inhalt vonWarum kann ich Klassendatenelemente in C nicht mit der direkten Initialisierungssyntax initialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!