Heim >Backend-Entwicklung >C++ >Warum können nicht konstante statische Mitglieder und Arrays nicht innerhalb einer C-Klassendefinition initialisiert werden?

Warum können nicht konstante statische Mitglieder und Arrays nicht innerhalb einer C-Klassendefinition initialisiert werden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-12 21:07:18540Durchsuche

Why Can't Non-Const Static Members and Arrays Be Initialized Within a C   Class Definition?

Warum statische Datenelemente und Arrays in Klassendefinitionen nicht initialisiert werden können

Nicht konstante statische Elemente

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

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.

Problemumgehung mit „enum Trick“

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};
};

Standardkonformitätsgründe

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!

Stellungnahme:
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