Warum muss maxSize
static
sein, damit es in einem Array verwendet werden kann?
Diese Frage hat zwei Aspekte
Aspekt 1
C ++ - Array hat eine feste Größe, deren Größe während der Kompilierungszeit bekannt sein muss. Wenn die Entscheidung zur Laufzeit verschoben werden muss, wird der Array-Ausdruck schlecht formatiert.
Aspekt 2
Wenn eine Membervariable als nicht statisch deklariert wird, wird sie zu einer Instanzvariable, deren Wert nur dann existiert, wenn das Objekt zur Laufzeit instanziiert wird. Eine statische Variable ist eine Klassenvariable, deren Wert während der Kompilierzeit bestimmt werden kann.
Ihr besonderes Beispiel wird zum klassischen Hühnerei-Paradoxon.
%Vor%armon
zu instanziieren, müssen Sie ihre Größe kennen. armon
. armon
zu instanziieren, müssen Sie ihre Größe kennen. Daher sollte die von der Array-Größe abhängige Variable ein konstanter Ausdruck sein, der in Ihrem speziellen Fall eine statische Variable sein sollte,
Es muss nicht sein, um statisch zu sein, aber es muss ein konstanter Ausdruck sein .
C ++ Standard § 8.3.4 [dcl.array] (Hervorhebung von mir):
Wenn der Konstantenausdruck (5.19) vorhanden ist, soll er ein konvertierter konstanter Ausdruck vom Typ std :: size_t sein und sein Wert größer als Null sein
Das heißt, das Folgende ist auch gültig:
%Vor%Hinweis:
Da der Compiler die Größe der Klasse kennen muss, können Sie dies nicht tun:
%Vor% Möglicherweise werden verschiedene Instanzen von Y
mit unterschiedlichen Größen erstellt.
Beachten Sie auch, dass in diesem Zusammenhang int array[size]
nicht ein konstanter Ausdruck ist, weil es this
verwendet, siehe C ++ - Standardabschnitt § 5.19 [expr.const]:
Ein Bedingungsausdruck e ist ein Kernkonstantenausdruck, es sei denn, die Auswertung von e nach den Regeln der abstrakten Maschine (1.9) würde einen der folgenden Ausdrücke auswerten:
- dies (5.1.1), außer in einer constexpr-Funktion oder einem consExpr-Konstruktor, der als Teil von e ausgewertet wird;
(die Auswertung von size
ist wirklich this->size
)
Es muss nicht statisch sein, es muss konstant sein.
Wenn Sie innerhalb einer Klasse eine Konstante deklarieren, machen Sie für jede Instanz der Klasse eine Konstante .
Auch wenn Ihr maxSize
nur const
ist, müssten Sie es in der Konstruktorinitialisierungsliste initialisieren, weil const maxSize
als Variable behandelt wird, deren Wert Sie nicht ändern können.
Innerhalb einer Klasse const
Schlüsselwort bedeutet "Dies ist eine Konstante während der gesamten Lebensdauer dieses Objekts". Verschiedene Objekte derselben Klasse können unterschiedliche Werte für diese Konstante haben.
Aber wenn es eine statische Konstante ist, wird nur eine Konstante für alle Instanzen der Klasse sein. Dies bedeutet, dass Sie den Konstantenwert in derselben Zeile initialisieren müssen, in der Sie ihn definieren.