In c ++ cosa significa una tilde "~" prima del nome di una funzione?


136
 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 ;  
 } ;

Risposte:


151

È il distruttore, distrugge l'istanza, libera memoria, ecc. Ecc.

Ecco una descrizione da ibm.com:

I distruttori vengono generalmente utilizzati per deallocare la memoria ed eseguire altre operazioni di pulizia per un oggetto di classe e i suoi membri di 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/en/ssw_ibm_i_74/rzarg/cplr380.htm


1
Questo collegamento è ora interrotto.
zenofpython,

2
@zenofpython Fixed!
inanutshellus,

75

Come altri hanno notato, nell'istanza in cui lo chiedi è il distruttore per class Stack.

Ma prendendo la tua domanda esattamente come appare nel titolo:

In c ++ cosa significa una tilde "~" prima del nome di una funzione?

c'è un'altra situazione. In qualsiasi contesto, tranne immediatamente prima del nome di una classe (che è il contesto del distruttore), ~è l'operatore del complemento (o bit a bit) di uno. A dire il vero non si presenta molto spesso, ma puoi immaginare un caso simile

if (~getMask()) { ...

che sembra simile, ma ha un significato molto diverso.


8

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


2
... se è allocato in pila. Quando 'delete' viene chiamato sull'oggetto se è allocato sull'heap.
Jherico,

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

@Jherico o vive nell'ambito dello spazio dei nomi o è un membro di classe statico o una variabile statica locale della funzione: la durata dell'archiviazione statica. In altre parole: tutti i prodotti vendibili con archiviazione automatica verranno automaticamente distrutti quando appropriato. Attenzione all'ordine di inizializzazione statica Fiasco
sehe

4

Questo è un distruttore. Viene chiamato quando l'oggetto viene distrutto (fuori portata o eliminato).

Per essere chiari, devi usare ~ NameOfTheClass come per il costruttore, altri nomi non sono validi.


2
"altri nomi sono validi"?
Razze di leggerezza in orbita

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

2

È il distruttore. Questo metodo viene chiamato quando l'istanza della tua classe viene distrutta:

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

1

Quello sarebbe il distruttore (liberando qualsiasi memoria dinamica)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.