Em c ++, o que significa um til "~" antes do nome de uma função?

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 ;  
 } ;
Monte Hurd
fonte

Respostas:

150

É o destruidor, destrói a instância, libera memória, etc. etc.

Aqui está uma descrição do ibm.com:

Destruidores geralmente são usados ​​para desalocar memória e fazer outra limpeza para um objeto de classe e seus membros de classe quando o objeto é destruído. Um destruidor é chamado para um objeto de classe quando esse objeto sai do escopo ou é explicitamente excluído.

Consulte https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htm

inanutshellus
fonte
1
Este link está quebrado agora.
Zenofpython 20/12/19
2
@zenofpython Fixed!
Inanutshellus
75

Como outros observaram, no exemplo em que você está perguntando, é o destruidor class Stack.

Mas, tomando sua pergunta exatamente como aparece no título:

Em c ++, o que significa um til "~" antes do nome de uma função?

existe outra situação. Em qualquer contexto, exceto imediatamente antes do nome de uma classe (que é o contexto destruidor), ~é o operador de complemento (ou não bit a bit). Para ter certeza de que não aparece com muita frequência, mas você pode imaginar um caso como

if (~getMask()) { ...

que parece semelhante, mas tem um significado muito diferente.

dmckee --- gatinho ex-moderador
fonte
8

É um destruidor. É garantido que a função seja chamada quando o objeto estiver fora do escopo.

Samuel Danielson
fonte
2
... se estiver alocado na pilha. Quando 'delete' é chamado no objeto, se ele estiver alocado no heap.
Jherico 08/09/09
@ Jerico: Na verdade, é quando a palavra-chave "excluir" é usada. Lembre-se de que a palavra-chave "new" chama "operator new" e, em seguida, chama o construtor no endereço retornado, para que seja perfeitamente possível "nova" memória na pilha. :) A palavra-chave "delete" chama o destruidor e depois chama "operator delete".
653 Troubadour
@Jherico ou vive no escopo do espaço para nome ou é um membro estático da classe ou variável estática local da função: a duração do armazenamento estático. Em outras palavras: todos os vairables com armazenamento automático serão destruídos automaticamente quando apropriado. Cuidado com o Fiasco da ordem de inicialização estática
sehe 15/10
4

Este é um destruidor. É chamado quando o objeto é destruído (fora do escopo da vida ou excluído).

Para ser claro, você deve usar ~ NameOfTheClass como para o construtor, outros nomes são inválidos.

Klaim
fonte
2
"outros nomes são válidos"?
Lightness Races in Orbit
Resposta antiga ... Acho que quis dizer que depois de ~ poderia ser qualquer nome, desde que seja o mesmo que o nome da classe e o nome do construtor.
Klaim
2

É o destruidor. Este método é chamado quando a instância da sua classe é destruída:

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

Esse seria o destruidor (liberando qualquer memória dinâmica)

maxfridbe
fonte