Definieren statischer Member in C ++

Ich versuche, eine öffentliche statische Variable wie folgt zu definieren:

public : static int j=0; //or any other value too 

Ich erhalte einen Kompilierungserrors genau in dieser Zeile: ISO C ++ verbietet die In-classn-Initialisierung des nicht-konstanten statischen Members “j”.

  1. Warum ist es in C ++ nicht erlaubt?

  2. Warum dürfen konstante Mitglieder initialisiert werden?

  3. Bedeutet dies, dass statische Variablen in C ++ nicht wie in C mit 0 initialisiert werden?

Vielen Dank !

(1.) Warum ist es in C ++ nicht erlaubt?

Aus Bjarne Stroustrups C ++ – Stil- und Technik-FAQ : A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects. A class is typically declared in a header file and a header file is typically included into many translation units. However, to avoid complicated linker rules, C++ requires that every object has a unique definition. That rule would be broken if C++ allowed in-class definition of entities that needed to be stored in memory as objects.

(2.) Warum dürfen konstante Mitglieder initialisiert werden?

[ schimpfte es besser ]

(3.) Bedeutet dies, dass statische Variablen in C ++ nicht mit 0 wie in C initialisiert werden?

Soweit ich weiß, solange Sie das statische Member var in einer .cpp deklarieren, wird es Null initialisiert, wenn Sie nicht anders angeben:

 // in some .cpp int Test::j; // j = int(); 

Sie müssen die statische Variable in einer CPP-Datei und nicht in der classndeklaration initialisieren.

Wenn Sie eine statische Variable in der class deklarieren, kann sie verwendet werden, ohne eine class zu instanziieren.

 //Header file class Test { public: static int j; }; //In cpp file //Initialize static variables here. int Test::j = 0; //Constructor Test::Test(void) { //Class initialize code } 

Warum ist es in C ++ nicht erlaubt?

Solange und solange Sie es nicht definieren, wird die Variable kein l-Wert.

Warum dürfen konstante Mitglieder initialisiert werden?

Auch in diesem Fall ist eine Definition erforderlich, wenn Sie die Adresse der Variablen übernehmen wollen.

9.4.2 Statische Datenmitglieder

2 Die Deklaration eines statischen Datenelements in seiner classndefinition ist keine Definition und kann von einem unvollständigen Typ sein, mit Ausnahme von cv-qualified void. Die Definition für ein statisches Datenelement muss in einem Namensbereichsbereich mit der classndefinition des Elements angezeigt werden. In der Definition im Namespacebereich muss der Name des statischen Datenmembers durch den classnnamen mithilfe des Operators :: qualifiziert werden. Der Initialisierungsausdruck in der Definition eines statischen Datenmembers liegt im Bereich seiner class

Außerdem ist dies in erster Linie ein Verwendungsartefakt, so dass Sie schreiben können:

 class S { static const int size = 42; float array[ size ]; }; 

Bedeutet dies, dass statische Variablen in C ++ nicht wie in C mit 0 initialisiert werden?

Nein, sie sind:

3.6.2 Initialisierung von nicht lokalen Variablen

Variablen mit statischer Speicherdauer (3.7.1) oder Thread-Speicherdauer (3.7.2) müssen vor jeder anderen Initialisierung auf Null initialisiert (8.5) werden.

Obwohl die Dinge in C ++ 0x etwas komplizierter werden. Alle Literaltypen können nun initialisiert werden (im Gegensatz zu nur ganzzahligen Typen im aktuellen Standard), was bedeutet, dass alle Skalartypen (einschließlich Gleitkommazahlen) und einige classntypen jetzt mithilfe eines Initialisierers in der Deklaration initialisiert werden können.

Die kurze Antwort:

Es entspricht dem extern int Test_j = 0; .

Wenn es kompilieren würde, was würde passieren? Jede Quelldatei einschließlich der Header-Datei Ihrer class würde ein Symbol mit dem Namen Test :: j initialisieren, das auf 0 initialisiert wird. Der Linker neigt dazu, das nicht zu mögen.

 class GetData { private: static int integer; //Static variable must be defined with the extension of keyword static; public: static void enter(int x) { integer = x; //static variable passed through the static function } static int show() //declared and defined { return integer; //will return the integer's value } }; int GetData::integer = 0; //Definition of the static variable int main() { GetData::enter(234); //value has been passed through the static function enter. Note that class containing static variables may not have the object in main. They can be called by scope resolution operator in main. cout<