2009-09-08 14 views
97
template <class T> 
class Stack 
{ 
public: 
    Stack(int = 10) ; 
    ~Stack() { delete [] stackPtr ; } //<--- What does the "~" signify? 
    int push(const T&); 
    int pop(T&) ; 
    int isEmpty()const { return top == -1 ; } 
    int isFull() const { return top == size - 1 ; } 
private: 
    int size ; 
    int top ; 
    T* stackPtr ; 
} ; 
+115

~ è l'operatore di negazione bit per bit. Quando applicato a una definizione di funzione, significa che la funzione farà l'opposto * di quello che dice che farà - per esempio, '~ push()' farà saltare la pila, e '~ writeSeriousComment()' produrrà effettivamente commenti come questo. –

+29

Per il beneficio del tipo di persona che sembra pubblicare la maggior parte delle domande C++ su questo sito, non tentare di leggere il commento di j_random_hacker. – Alan

+34

per il beneficio di persone che hanno il senso dell'umorismo (e alcune conoscenze di programmazione di base), prova a leggere il commento di j_random_hacker. –

risposta

104

E 'il distruttore, distrugge l'istanza, libera la memoria, ecc ecc

Ecco una descrizione da ibm.com:

distruttori sono di solito utilizzati per rilasciare la memoria e fare altre pulizia per un oggetto di classe e i suoi membri della classe quando l'oggetto viene distrutto. Un distruttore viene chiamato per un oggetto classe quando quell'oggetto esce dall'ambito o viene eliminato esplicitamente.

Vedi https://www.ibm.com/support/knowledgecenter/SSB27U_5.4.0/com.ibm.zos.r9.cbclx01/cplr380.htm

3

Questo è un distruttore. Viene chiamato quando l'oggetto viene distrutto (fuori dalla portata della vita o cancellato).

Per essere chiari, è necessario utilizzare ~ NameOfTheClass come per il costruttore, altri nomi non sono validi.

+2

"altri nomi sono validi"? –

+0

Vecchia risposta ... Penso che volevo dire che dopo ~ potrebbe essere un nome qualsiasi, purché sia ​​uguale al nome della classe e al nome del costruttore. – Klaim

5

È un distruttore. La funzione è garantita per essere chiamata quando l'oggetto esce dall'ambito.

+1

... se è allocato nello stack.Quando viene chiamato 'delete' sull'oggetto se è allocato sull'heap. – Jherico

+0

@Jherico: In realtà è quando viene utilizzata la parola chiave "elimina". Ricorda che la parola chiave "new" richiama "operator new" e quindi chiama il costruttore sull'indirizzo restituito, quindi è perfettamente possibile la "nuova" memoria nello stack. :) La parola chiave "cancella" chiama il distruttore e quindi richiama "cancella operatore". – Troubadour

+0

@Jherico o vive nello spazio dei nomi o è un membro della classe statico o una variabile statica locale della funzione: la durata dell'archiviazione statica. In altre parole: tutti i passeggeri con memoria automatica verranno automaticamente distrutti quando appropriato. Attenzione [Faticco di inizializzazione statica] (http://stackoverflow.com/a/1005709/85371) – sehe

1

Questo sarebbe il distruttore (liberando la memoria dinamica)

2

E 'il distruttore. Questo metodo viene chiamato quando l'istanza della classe è distrutto:

Stack<int> *stack= new Stack<int>; 
//do something 
delete stack; //<- destructor is called here; 
+1

C'è un * mancante. – Klaim

+0

luppolo .. grazie :-) – Pierre

52

Come altri hanno notato, nel caso ti stai chiedendo a questo proposito è il distruttore per class Stack.

Ma prendendo la tua domanda esattamente come appare nel titolo:

in C++ che cosa fa una tilde “~” prima di un nome di funzione significa?

c'è un'altra situazione. In qualsiasi contesto eccetto immediatamente prima del nome di una classe (che è il contesto del distruttore), ~ è l'operatore complementare (o non bit per bit). Per essere sicuri che non compare molto spesso, ma si può immaginare un caso come

if (~getMask()) { ... 

che è simile, ma ha un significato molto diverso.

Problemi correlati