2009-09-08 19 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

~ est l'opérateur de négation au niveau du bit. Lorsqu'il est appliqué à une définition de fonction, cela signifie que la fonction fera le * contraire * de ce qu'elle dit qu'elle va faire - par exemple, '~ push()' apparaîtra vraiment dans la pile, et '~ writeSeriousComment()' produira effectivement des commentaires comme celui-ci. –

+29

Pour le genre de personne qui semble afficher la plupart des questions C++ sur ce site, n'essayez pas de lire le commentaire de j_random_hacker. – Alan

+34

pour le bénéfice des personnes qui ont le sens de l'humour (et quelques connaissances de base en programmation) DO essayer de lire le commentaire de j_random_hacker. –

Répondre

104

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

est ici une description de ibm.com:

Destructeurs sont généralement utilisés pour désaffecter la mémoire et faire 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 est 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

3

Ceci est un destructor. Il est appelé lorsque l'objet est détruit (hors de la 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.

+2

"les autres noms sont-ils valides"? –

+0

Vieille réponse ... Je pense que je voulais dire qu'après ~ ça pourrait être n'importe quel nom aussi longtemps que c'est le même que le nom de la classe et le nom du constructeur. – Klaim

5

C'est un destructeur. La fonction est garantie d'être appelée lorsque l'objet est hors de portée.

+1

... si elle est allouée sur la pile.Lorsque 'delete' est appelé sur l'objet s'il est alloué sur le tas. – Jherico

+0

@Jherico: C'est en fait le mot-clé "delete" qui est utilisé. Rappelez-vous que le mot-clé "new" invoque "operator new" et appelle ensuite le constructeur sur l'adresse retournée afin qu'il soit parfaitement possible de "nouveau" mémoire sur la pile. :) Le mot-clé "delete" appelle le destructeur et appelle ensuite "operator delete". – Troubadour

+0

@Jherico ou vit à l'étendue de l'espace de noms ou est un membre de classe statique ou une variable statique fonction-locale: 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 de [Static Initialization Order Fiasco] (http://stackoverflow.com/a/1005709/85371) – sehe

1

Ce serait le destructor (libérant une mémoire dynamique)

2

Il est le destructor. 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; 
+1

Il y a un * manquant. – Klaim

+0

houblon .. merci :-) – Pierre

52

Comme d'autres l'ont noté, dans l'instance que vous demandez à ce sujet est le destructor pour class Stack.

Mais prendre votre question exactement comme il apparaît dans le titre:

en C++ ce qui fait un tilde « ~ » avant un nom de fonction signifie?

il existe une autre situation. Dans tous les contextes sauf immédiatement avant le nom d'une classe (qui est le contexte du destructeur), ~ est son opérateur complémentaire (ou bitwise non). Pour être sûr qu'il ne vient pas très souvent, mais vous pouvez imaginer un cas comme

if (~getMask()) { ... 

qui ressemble, mais a un sens très différent.