Warum können nicht konstante statische Elemente oder statische Arrays nicht innerhalb einer Klasse initialisiert werden?
Innerhalb einer Klasse können statische Datenelemente nicht initialisiert werden werden nur initialisiert, wenn sie konstant und vom ganzzahligen Typ sind. Diese Einschränkung ergibt sich aus der Anforderung des C-Standards, dass jedes Objekt eine eindeutige Definition haben muss.
Initialisierung nicht konstanter statischer Elemente:
Gemäß dem C-Standard (C 03 9.4 .2) können statische Datenmember von nicht konstanten Typen nicht innerhalb der Klassendefinition initialisiert werden. Der folgende Code veranschaulicht dies:
class A { static int b = 3; };
Dieser Code verstößt gegen den Standard und erzeugt einen Fehler, da das statische Mitglied b nicht konstant ist und versucht, es innerhalb der Klasse zu initialisieren.
Statische Array-Initialisierung:
Ebenso können statische Arrays nicht innerhalb einer Klassendefinition initialisiert werden, selbst wenn dies der Fall ist const. Dies liegt daran, dass statische Arrays als Objekte im Speicher gespeichert werden. Daher können sie nicht innerhalb der Klassendefinition initialisiert werden, da dies gegen die Anforderung eindeutiger Definitionen verstoßen würde.
class A { static const int c[2] = { 1, 2 }; };
Dieser Code verstößt erneut gegen den Standard und führt zu Fehlern.
Problemumgehung und Gründe:
Eine Problemumgehung für die Initialisierung eines statischen Arrays innerhalb einer Klasse besteht darin, den „Enum-Trick“ zu verwenden folgt:
class A { static const int a = 3; enum { arrsize = 2 }; static const int c[arrsize] = { 1, 2 }; };
Der Grund für das Verbot der klasseninternen Initialisierung statischer Datenelemente hängt mit der Tatsache zusammen, dass Headerdateien, die Klassendeklarationen enthalten, typischerweise in mehreren Übersetzungseinheiten enthalten sind. Um Linker-Probleme zu vermeiden, erfordert C, dass jedes Objekt eine eindeutige Definition hat. Wenn die klasseninterne Initialisierung speicherresidenter Entitäten zulässig wäre, würde diese Regel gebrochen.
In C 11 wurde die Einschränkung jedoch in gewissem Maße gelockert. Wenn ein statisches Datenelement einen const-Literaltyp aufweist, kann es mithilfe eines Klammer-oder-Gleich-Initialisierers innerhalb der Klassendefinition initialisiert werden. Darüber hinaus können nicht statische Datenelemente jetzt zum Zeitpunkt der Deklaration initialisiert werden. Diese Funktionen sind noch nicht in allen Compilern vollständig implementiert, beispielsweise in gcc 4.7.
Das obige ist der detaillierte Inhalt vonWarum können nicht konstante statische Mitglieder oder statische Arrays nicht innerhalb einer Klassendefinition in C initialisiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!