Domanda

Se ho una classe chiamata di Test ::

class Test
{
    static std::vector<int> staticVector;
};

quando non staticVector ottenere costruiti e quando viene distrutta ?

È con la creazione del primo oggetto della classe di Test, o solo come normali variabili statiche ?

Giusto per chiarire, questa domanda mi è venuta in mente dopo la lettura di Concetti di Linguaggi di Programmazione (Sebesta Ch-5.4.3.1) e dice ::

Si noti che quando il statico modificatore appare la dichiarazione di una variabile in una definizione di classe in C++, Java e C#, non ha nulla a che fare con il ciclo di vita di una variabile.In che contesto, significa che la variabile è un variabile di classe, piuttosto che un variabile di istanza.L'uso multiplo di una parola riservata può essere fonte di confusione in particolare per coloro che stanno imparando l' lingua.

hai capito?:(

È stato utile?

Soluzione

Esattamente come un normale statica (globale) variabili.

Altri suggerimenti

Voglio scrivere un testo sul initializaton troppo, che posso poi collegare.


Primo elenco di possibilità.

  • Spazio dei nomi Statico
  • Classe Statico
  • Locale Statico

Spazio Dei Nomi Statici

  • Ci sono due i metodi di inizializzazione. statico (destinato a succedere al momento della compilazione) e dinamica (destinato a succedere a runtime) di inizializzazione.
  • Statico Inizializzazione succede prima qualsiasi inizializzazione dinamica, trascurando di unità di traduzione per le relazioni.
  • Dinamica Initiaization è ordinata in un'unità di traduzione, mentre non c'è nessun ordine particolare di inizializzazione statica.Oggetti di spazio dei nomi ambito della stessa unità di traduzione sono dinamicamente inizializzato nell'ordine in cui definizione appare.
  • CONTENITORE tipo di oggetti che vengono inizializzati con espressioni costanti sono staticamente inizializzato.Il loro valore può essere invocata da alcuna dinamica dell'oggetto di inizializzazione, trascurando di unità di traduzione per le relazioni.
  • Se l'inizializzazione genera un'eccezione std::terminate viene chiamato.

Esempi:

Il seguente programma stampa A(1) A(2)

struct A { 
  A(int n) { std::printf(" A(%d) ", n); } 
};

A a(1);
A b(2);

E il seguente, basato sulla stessa classe, stampe A(2) A(1)

extern A a;
A b(2);
A a(1);

Facciamo finta che ci sia una unità di traduzione, dove msg è definito come segue

char const *msg = "abc";

Quindi le seguenti stampe abc.Nota che p riceve inizializzazione dinamica.Ma perché l'inizializzazione statica (char const* è un tipo POD, e "abc" è un indirizzo costante espressione) msg accade prima, questo è bene, e msg è garantito per essere inizializzato correttamente.

extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
  • Dinamica l'inizializzazione di un oggetto non è richiesto per accadere prima a tutti i costi.L'inizializzazione deve accadere prima che il primo uso di un oggetto o di una funzione della sua unità di traduzione, però.Questo è importante per la dinamica caricabili librerie.

Classe Statica

  • Si comportano come spazio dei nomi statica.
  • C'è un bug-report se il compilatore è consentito per inizializzare la classe statica, il primo uso di una funzione o di un oggetto della sua unità di traduzione troppo (dopo).La formulazione della Norma attualmente consente solo di questo spazio dei nomi per gli oggetti di ambito - ma sembra che non intende permettere che questo per la classe di oggetti di ambito di troppo.Leggi Oggetti di Ambito spazio dei nomi.
  • Per la classe statica che sono stati di modelli la regola è che non sono solo inizializzato se si sono mai utilizzato.Non sono in uso, non cedere a un'inizializzazione.Nota che, in ogni caso, l'inizializzazione accadrà come spiegato sopra.Inizializzazione di non essere in ritardo perché è un membro di un modello.

Locale Statico

  • Per locale statica, regole speciali accadere.
  • CONTENITORE di oggetti di tipo inizializzato con espressione costante vengono inizializzate prima il blocco in cui sono definiti è inserito.
  • Locali di altri oggetti statici vengono inizializzati, per il momento, il controllo passa attraverso la loro definizione.L'inizializzazione non è considerata completa quando viene generata un'eccezione.L'inizializzazione sarà provato di nuovo la prossima volta.

Esempio:Il seguente programma stampa 0 1:

struct C { 
  C(int n) { 
    if(n == 0)
      throw n;
    this->n = n;
  }
  int n;
};

int f(int n) {
  static C c(n);
  return c.n;
}

int main() {
  try { 
    f(0); 
  } catch(int n) { 
    std::cout << n << " "; 
  }
  f(1); // initializes successfully
  std::cout << f(2);  
}

In tutti i casi di cui sopra, in alcuni limitati casi, per alcuni oggetti che non sono necessarie per essere inizializzato in modo statico, il compilatore può staticamente inizializzazione, anziché in modo dinamico l'inizializzazione.Questo è un problema delicato, vedere questa risposta per un esempio più dettagliato.

Inoltre, si noti che l'ordine di distruzione è l'ordine esatto di completamento dei lavori di costruzione degli oggetti.Si tratta di un comune e succede in tutti i tipi di situazioni in C++, anche in caso provvisori.

Esso viene costruito, allo stesso tempo, le variabili globali ottenere costruiti ed eliminati insieme con il globals così.

Semplicemente parlando:
Un membro statico variabile è costruita quando le variabili globali sono costruiti.La costruzione delle variabili globali non è definito, ma succede prima che la principale funzione è inserito.

La distruzione avviene quando le variabili globali sono distrutto.

Le variabili globali sono distrutte in ordine inverso sono stati costruiti;dopo l'uscita principale funzione.

Saluti,
Ovanes

P. S.:Suggerisco di dare un'occhiata al C++Standard, il che spiega (definisce) come e quando globali o variabili membro statico sono costruito o distrutto.

P. P. S.:Il codice solo dichiara una variabile membro static, ma non inizializzate.Per inizializzare si deve scrivere in una delle compilation unità:

std::vector Test::staticVector;
o
std::vector Test::staticVector=std::vector(/* costruttore params qui */);

Alcune specifiche VC++ informazioni nel caso in cui ciò che si sta utilizzando:

  1. Classe statica variabili costruzione si verifica allo stesso tempo come altri statico/variabili globali.
  2. In windows, l'avvio CRT funzione è responsabile per questo tipo di costruzione.Questo è il vero punto di ingresso della maggior parte dei programmi di compilazione (è la funzione che chiama il tuo Main/funzione Winmain).In aggiunta, è responsabile per l'inizializzazione di tutta la C runtime di supporto (per esempio: avete bisogno di usare malloc).
  3. L'ordine di costruzione è definito, tuttavia, quando si utilizza microsoft VC compilatore l'ordine di costruzione per i tipi di base sarà OK, per esempio, è legale e sicuro per scrivere

la statica.h:...MyClass dichiarazione ...static const int a;static int b;static int ar[];} statics.cpp:

const int MyClass::a = 2;
int MyClass::b = a+3;
int MyClass::ar[a] = {1,2}

Statico variabile membro della classe, anche se ci sono più oggetti della stessa classe, la variabile sarà lo stesso per tutti gli oggetti della classe.

Quindi, direi, è costruito quando il primo è istanziata e distrutti quando l'ultimo oggetto è desctructed.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top