2010-05-24 16 views
12

Dire che ho:Un distruttore distruggerà un membro statico?

class A 
{ 
    A() 
    {} 
    ~A() 
    {} 
}; 

class B 
{ 
public: 
    B() 
    {} 
    ~B() 
    {} 
private: 
    static A mA; 
}; 

B* pB = new B; 
delete pB; 

Quando chiamo eliminare Pb, sarà chiamato distruttore di B. Chiamerà quindi il distruttore per il membro statico A?

+1

forse la tua domanda è "Quando i membri statici vengono distrutti"? –

risposta

22

La parola chiave static indica che la variabile è indipendente dalle istanze. Ecco perché è possibile accedere a variabili e metodi statici senza istanziare un oggetto dalla classe in primo luogo. Ecco perché distruggere un'istanza non influirà su nessuna variabile statica.

12

Ovviamente no. Prima di tutto, hai definito un distruttore vuoto esplicito. E se il distruttore predefinito lo ha fatto, non è mai possibile distruggere le istanze senza rischiare di rendere inutilizzabile la classe.

+2

L'esistenza di un distruttore vuoto esplicito non ha molta importanza. –

1

Gli oggetti con una durata statica verranno distrutti quando l'applicazione termina. Tra i vari oggetti statici che potrebbero essere presenti nel programma, i distruttori sono chiamati nell'ordine inverso di come sono stati costruiti gli oggetti.

La costruzione/distruzione di istanze di oggetto non ha alcun effetto su quando un membro statico viene costruito o distrutto.

1

I membri statici non vivono nello spazio di memoria assegnato a un'istanza della classe. Pertanto, non sarà cancellato o deinitialized a meno che non lo si fa in modo esplicito in qualsiasi parte del codice (compreso il distruttore di classe, ma la logica del codice deve gestire la possibilità di avere più istanze e così via ...)

1

Static le variabili sono anche conosciute come variabili di classe. Questo è in contrasto con le variabili di istanza. Come suggerisce questo nome, le variabili di classe appartengono all'intera classe, dove le variabili di istanza appartengono a un'istanza. Si può ricavare la durata di queste variabili sulla base di questi fatti.

Un altro modo di considerare questo presuppone che chiamare il distruttore distrugga effettivamente le variabili statiche. Immagina che la conseguenza di un oggetto venga istanziata e quindi venga eliminata. Cosa succederebbe alle variabili statiche che sono condivise da tutti gli altri oggetti della classe che sono ancora in uso.

7

C++ standard 03, 9.4.2 membri dati statici:

Un membro dati statico non fa parte di gli oggetti secondari di una classe. C'è una sola copia di un membro di dati statici condivisa da tutti gli oggetti della classe class.class.

Un membro di dati statici non fa parte della classe, quindi non è legato alla durata delle classi né alla costruzione o alla distruzione.

costruzione (9.4.2/3)

volta che l'elemento di dati static stato definito, esiste anche se sono stati creati oggetti della sua classe sono state created.of sua classe .

Distruzione (9.4.2/7)

I membri di dati statici sono inizializzati e distrutti esattamente come oggetti non locali.

Problemi correlati