2010-08-21 12 views
22

Ich versuche, eine öffentliche statische Variable wie folgt zu definieren:definieren statische Member in C++

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

ich einen Kompilierungsfehler auf dieser sehr Linie bekommen: ISO C++ verbietet in Klasse Initialisierung der nicht konstanten statischen Mitglied `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 mit 0 wie in C initialisiert werden?

Vielen Dank!

Antwort

14

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

Von Bjarne Stroustrup's C++ Style and Technique 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.

(2.) Warum sind const Mitglieder erlaubt initialisiert werden?

[dirkgently said it better]

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

Soweit ich weiß, wie lange, wie Sie das statische Element var in einer CPP erklären wird es Null initialisiert, wenn Sie nicht anders angegeben werden:

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

Danke für die tolle Antwort, Sie haben mich davon abgehalten, mein Gehör aus meinem Kopf zu ziehen! Ich habe aber eine Frage, gibt es eine Möglichkeit, einen Nullzeiger beim Definieren von Referenzmembern zu liefern? –

+1

@TimVisee Nicht sicher, ob es möglich ist - zumindest in einer tragbaren, nicht UB-Weise - aber Sie würden mit einer ungültigen Referenz enden. Wenn Sie NULL Semantik wollen, verwenden Sie einfach einen Zeiger oder vielleicht etwas wie Boost Optional. –

16

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

Wenn Sie eine statische Variable in der Klasse deklarieren, kann sie verwendet werden, ohne eine Klasse 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 
} 
17

Warum ist es nicht in C++ erlaubt?

Bis und wenn 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 Datenelemente

Die Deklaration eines statischen Daten Element in seiner Klassendefinition nicht eine Definition ist, und eines unvollständigen anderen Typ als cv sein kann, -qualifizierte Leere Die Definition für eines statischen Datenelements muss in einem Namensraumbereich mit der Klassendefinition des Elements angezeigt werden. In der Definition unter Namensraumbereich muss der Name des statischen Datenelements über seinen Klassennamen mit dem Operator :: qualifiziert werden. Der Initialisierer Ausdruck in der Definition eines statischen Daten Mitglied im Rahmen seiner Klasse

Auch dies ist in erster Linie eine Nutzung Artefakt, so dass Sie schreiben können:

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

Does diese mittleren statischen Variablen in C++ werden nicht mit 0 als in C initialisiert?

Nein sie sind:

3.6.2 Initialisierung nicht lokaler Variablen

Variables mit statischer Speicherdauer (3.7.1) oder Fadenspeicherdauer (3.7. 2) muss auf Null initialisiert werden (8.5) bevor irgendeine andere Initialisierung Platz findet.

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 Klassentypen jetzt mithilfe eines Initialisierers in der Deklaration initialisiert werden können.

+0

Warum Definition für statische const Integer ist nicht erforderlich, wenn die Adresse nicht vergeben wird? It (static-const-int definiert in .h) kompiliert, verknüpft erfolgreich ohne Definition. Wenn ja, da, wenn C++ diese Art der Deklaration ohne Definition erlaubt, seit C++ 98? seit C++ 03? Authentische Quellen bitte. C++ Standard (9.4.2) ist nicht mit den Compilern synchronisiert. Es wird erwähnt, dass das Mitglied noch definiert werden muss, wenn es im Programm verwendet wird. Also, ich werde Ihnen sagen, ich suche nicht nach dem C++ Standard. Was gut ist, ist GCC Changelog/C++ Committee Notes. – smRaj

8

Die kurze Antwort:

Es ist äquivalent zu sagen extern int Test_j = 0;.

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

+4

+1."extern" beleuchtet das Thema hier. – Cheezmeister

2
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<<GetData::show();  
}  
Verwandte Themen