Heim >Backend-Entwicklung >C++ >Warum können nicht konstante statische Mitglieder und Arrays nicht innerhalb einer C-Klassendefinition initialisiert werden?
Der C-Standard schränkt die Initialisierung statischer Daten ein Mitglieder innerhalb von Klassendefinitionen nur auf statische konstante Integral- oder Aufzählungstypen.
class A { static const int a = 3; // Allowed static int b = 3; // Error: Non-const static member cannot be initialized in class definition static const int c[2] = {1, 2}; // Allowed static int d[2] = {1, 2}; // Error: Non-const static array cannot be initialized in class definition };
Diese Einschränkung gilt aufgrund der Art und Weise, wie statische Datenelemente vom Compiler behandelt werden. Jedes statische Datenelement muss eine eindeutige Definition haben. Wenn es in der Klassendefinition initialisiert wird, werden mehrere Definitionen erstellt, wenn die Klasse in mehreren Übersetzungseinheiten enthalten ist.
Statische Arrays, Selbst konstante Arrays können in Klassendefinitionen nicht initialisiert werden, da ihre Größe zur Kompilierungszeit nicht bestimmt werden kann. Der Compiler benötigt die Kenntnis der Größe eines Arrays, bevor er Speicher für das Array zuweisen kann.
Um statische Arrays in Klassendefinitionen zu initialisieren, ist eine Problemumgehung mit dem „Enum-Trick“ kann angewendet werden:
class A { static const int a = 3; enum { arrSize = 2 }; static const int c[arrSize] = {1, 2}; };
Die Einschränkung des Standards bei der Initialisierung Nicht konstante statische Member ergeben sich aus der Notwendigkeit, mehrdeutige Definitionen zu verhindern und eindeutige Memberdefinitionen über Übersetzungseinheiten hinweg sicherzustellen.
Bei statischen Arrays hat das Design der C-Sprache der Effizienz bei der Kompilierung Priorität eingeräumt, weshalb die Array-Größe erforderlich ist zur Kompilierzeit bekannt sein, um die Speicherzuweisung zu optimieren. Mit C 11 wurde jedoch das Konzept konstanter Ausdrücke eingeführt, das die Initialisierung von const-Datenelementen mit zur Kompilierzeit bestimmten Werten ermöglicht, was in zukünftigen C-Versionen möglicherweise mehr Flexibilität bietet.
Das obige ist der detaillierte Inhalt vonWarum können nicht konstante statische Mitglieder und Arrays nicht innerhalb einer C-Klassendefinition initialisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!