Warum muss diese Variable statisch sein?

8
%Vor%

Warum muss maxSize static sein, damit es in einem Array verwendet werden kann?

    
Armon Safai 04.09.2014, 08:02
quelle

3 Antworten

5

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%
  • Um Ihre Klasse armon zu instanziieren, müssen Sie ihre Größe kennen.
  • Um seine Größe zu kennen, müssen Sie die Größe der einzelnen Mitglieder kennen. In Ihrem speziellen Fall müssen Sie die Größe des Arrays kennen.
  • Um die Größe des Arrays zu kennen, müssen Sie den Wert der abhängigen Variable maxSize kennen.
  • Um auf die abhängige Variable maxSize zuzugreifen, müssen Sie die Klasse armon .
  • instanziieren
  • Um Ihre Klasse 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,

    
Abhijit 04.09.2014, 12:22
quelle
14

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 )

    
quantdev 04.09.2014 08:17
quelle
1

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.

    
User231454 04.09.2014 09:45
quelle

Tags und Links