Definizione di membri statici in C ++

Sto cercando di definire una variabile statica pubblica come questa:

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

Sto ottenendo un errore di compilazione proprio su questa linea: ISO C ++ vieta l’inizializzazione in-house del membro statico non-const `j ‘.

  1. Perché non è consentito in C ++?

  2. Perché i membri const possono essere inizializzati?

  3. Significa che le variabili statiche in C ++ non sono inizializzate con 0 come in C?

Grazie !

(1.) Perché non è permesso in C ++?

Dalle domande frequenti su stile e tecnica C ++ di Bjarne Stroustrup : 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.) Perché i membri const possono essere inizializzati?

[ dirkgently detto meglio ]

(3.) Questo significa che le variabili statiche in C ++ non sono inizializzate con 0 come in C?

Per quanto ne so, a patto che dichiari il membro statico var in un file .cpp verrà inizializzato a zero se non specifichi diversamente:

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

Dovrai inizializzare la variabile statica in un file .cpp e non nella dichiarazione della class.

Quando si dichiara una variabile statica nella class, può essere utilizzata senza creare un’istanza di una class.

 //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 } 

Perché non è consentito in C ++?

Fino a quando, a meno che non lo si definisca, la variabile non diventa un valore-l.

Perché i membri const possono essere inizializzati?

Anche in questo caso, è necessaria una definizione se si intende prendere l’indirizzo della variabile.

9.4.2 Membri di dati statici

2 La dichiarazione di un membro statico dei dati nella sua definizione di class non è una definizione e può essere di un tipo incompleto diverso da qualificati cv-qualificati. La definizione per un membro di dati statici deve apparire in un ambito namespace che racchiude la definizione di class del membro. Nella definizione nello spazio dei nomi, il nome del membro dei dati statici deve essere qualificato dal suo nome di class utilizzando l’operatore ::. L’espressione di inizializzazione nella definizione di un membro di dati statici è nell’ambito della sua class

Inoltre, questo è principalmente un artefatto di utilizzo in modo che tu possa scrivere:

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

Significa che le variabili statiche in C ++ non sono inizializzate con 0 come in C?

No loro sono:

3.6.2 Inizializzazione di variabili non locali

Le variabili con durata di memorizzazione statica (3.7.1) o durata di memorizzazione del thread (3.7.2) devono essere inizializzate a zero (8.5) prima di qualsiasi altra inizializzazione.

Anche se le cose diventano un po ‘più complicate in C ++ 0x. Tutti i tipi letterali possono ora essere inizializzati (al contrario dei soli tipi interi nello standard corrente), il che significherebbe che tutti i tipi scalari (float inclusi) e alcuni tipi di classi possono ora essere inizializzati usando un inizializzatore nella dichiarazione.

La risposta breve:

È equivalente a dire extern int Test_j = 0; .

Se è stato compilato, cosa accadrebbe? Ogni file sorgente incluso il file di intestazione della tua class definirà un simbolo chiamato Test :: j inizializzato a 0. Il linker tende a non gradirlo.

 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<