web-dev-qa-db-fra.com

En c ++, que signifie un tilde "~" avant un nom de fonction?

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

C'est le destructeur, il détruit l'instance, libère de la mémoire, etc.

Voici une description de ibm.com:

Les destructeurs sont généralement utilisés pour libérer de la mémoire et effectuer un autre nettoyage pour un objet de classe et ses membres de classe lorsque l'objet est détruit. Un destructeur est appelé pour un objet de classe lorsque cet objet passe hors de portée ou est explicitement supprimé.

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

135
inanutshellus

Comme d’autres l’ont noté, dans le cas que vous demandez, c’est le destructeur de class Stack.

Mais si vous prenez votre question exactement telle qu'elle apparaît dans le titre:

En c ++, que signifie un tilde “~” avant un nom de fonction?

il y a une autre situation. Dans n'importe quel contexte sauf immédiatement avant le nom d'une classe (qui est le contexte du destructeur), ~ est l’opérateur complémentaire (ou non au niveau du bit). Bien sûr, cela n’arrive pas très souvent, mais vous pouvez imaginer un cas comme celui-ci.

if (~getMask()) { ...

qui ressemble, mais a une signification très différente.

65
dmckee

C'est un destructeur. L'appel de la fonction est garanti lorsque l'objet sort de la portée.

7
Samuel Danielson

Ceci est un destructeur. Il est appelé lorsque l'objet est détruit (hors de portée de la vie ou supprimé).

Pour être clair, vous devez utiliser ~ NameOfTheClass comme pour le constructeur, les autres noms sont invalides.

4
Klaim

C'est le destructeur. Cette méthode est appelée lorsque l'instance de votre classe est détruite:

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

Ce serait le destructeur (libérant toute mémoire dynamique)

1
maxfridbe