En C ++ que signifie un tilde «~» devant un nom de fonction?

137
 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
la source

Réponses:

152

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

Voici une description d'ibm.com:

Les destructeurs sont généralement utilisés pour désallouer la mémoire et effectuer d'autres nettoyages 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 est hors de portée ou est explicitement supprimé.

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

inanutshellus
la source
1
Ce lien est maintenant rompu.
zenofpython
2
@zenofpython corrigé!
inanutshellus
76

Comme d'autres l'ont noté, dans le cas où vous posez la question, c'est le destructeur pour class Stack.

Mais en prenant votre question exactement telle qu'elle apparaît dans le titre:

En C ++ que signifie un tilde «~» devant un nom de fonction?

il y a une autre situation. Dans n'importe quel contexte, sauf juste avant le nom d'une classe (qui est le contexte du destructeur), se ~trouve l'opérateur complémentaire à un (ou non au niveau du bit). Pour être sûr que cela n'arrive pas très souvent, mais vous pouvez imaginer un cas comme

if (~getMask()) { ...

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

dmckee --- chaton ex-modérateur
la source
8

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

Samuel Danielson
la source
2
... s'il est alloué sur la pile. Lorsque 'delete' est appelé sur l'objet s'il est alloué sur le tas.
Jherico
@Jherico: En fait, c'est lorsque le mot-clé "supprimer" est utilisé. Rappelez-vous que le mot clé "new" invoque "operator new" puis appelle le constructeur sur l'adresse retournée donc il est parfaitement possible de "new" mémoire sur la pile. :) Le mot-clé "delete" appelle le destructeur puis appelle "operator delete".
Troubadour
@Jherico ou vit à la portée de l'espace de noms ou est un membre de classe statique ou une variable statique locale de fonction: la durée de stockage statique. En d'autres termes: tous les vairables avec stockage automatique seront automatiquement détruits le cas échéant. Méfiez - vous des Initialisation statique ordre Fiasco
sehe
4

C'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 ne sont pas valides.

Klaim
la source
2
"les autres noms sont valides"?
Courses de légèreté en orbite le
Ancienne réponse ... Je pense que je voulais dire qu'après ~ il pourrait s'agir de n'importe quel nom du moment que c'est le même que le nom de la classe et le nom du constructeur.
Klaim
2

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;
Pierre
la source
1

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

maxfridbe
la source