Heim > Backend-Entwicklung > C++ > Warum kann ich Klassendatenelemente in C nicht mit der direkten Initialisierungssyntax initialisieren?

Warum kann ich Klassendatenelemente in C nicht mit der direkten Initialisierungssyntax initialisieren?

Linda Hamilton
Freigeben: 2024-11-17 16:10:02
Original
303 Leute haben es durchsucht

Why can't I initialize class data members in C   using direct initialization syntax?

Warum das Initialisieren von Klassendatenelementen mit direkter Syntax in C verboten ist

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???
};
Nach dem Login kopieren

Beim Kompilieren dieses Codes treten Fehler auf:

11    9 [Error] expected identifier before numeric constant
11    9 [Error] expected ',' or '...' before numeric constant
Nach dem Login kopieren

Warum passiert das? Sehen wir uns die Haltung des C-Standards zur Initialisierung von Klassendatenelementen an.

Parsing-Mehrdeutigkeit

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;
};
Nach dem Login kopieren

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.

Bestehende Auflösungsregeln

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;
};
Nach dem Login kopieren

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
};
Nach dem Login kopieren

Allerdings führen beide Lösungen Feinheiten ein, die zu Missverständnissen führen können.

Vorgeschlagene Lösung

Um diese Unklarheiten zu beseitigen, Der C-Standard schlug vor, nur Initialisierer der folgenden Formen zuzulassen:

  • = initializer-clause
  • { initializer-list }

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage