Was bedeutet in c ++ eine Tilde "~" vor einem Funktionsnamen?

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
quelle

Antworten:

150

Es ist der Destruktor, es zerstört die Instanz, macht Speicher frei usw. usw.

Hier ist eine Beschreibung von ibm.com:

Destruktoren werden normalerweise verwendet, um Speicher freizugeben und andere Bereinigungen für ein Klassenobjekt und seine Klassenmitglieder durchzuführen, wenn das Objekt zerstört wird. Ein Destruktor wird für ein Klassenobjekt aufgerufen, wenn dieses Objekt den Gültigkeitsbereich verlässt oder explizit gelöscht wird.

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

inanutshellus
quelle
1
Dieser Link ist jetzt defekt.
Zenofpython
2
@zenofpython behoben!
Inanutshellus
75

Wie andere angemerkt haben, ist in dem Fall, in dem Sie danach fragen, der Destruktor für class Stack.

Aber nehmen Sie Ihre Frage genau so, wie sie im Titel erscheint:

Was bedeutet in c ++ eine Tilde "~" vor einem Funktionsnamen?

Es gibt eine andere Situation. In jedem Kontext, außer unmittelbar vor dem Namen einer Klasse (der der Destruktorkontext ist), ~ist dies der Komplementoperator (oder der bitweise nicht). Natürlich kommt es nicht sehr oft vor, aber Sie können sich einen Fall wie diesen vorstellen

if (~getMask()) { ...

das sieht ähnlich aus, hat aber eine ganz andere Bedeutung.

dmckee --- Ex-Moderator Kätzchen
quelle
8

Es ist ein Zerstörer. Die Funktion wird garantiert aufgerufen, wenn das Objekt den Gültigkeitsbereich verlässt.

Samuel Danielson
quelle
2
... wenn es auf dem Stapel zugeordnet ist. Wenn 'delete' für das Objekt aufgerufen wird, wenn es auf dem Heap zugeordnet ist.
Jherico
@Jherico: Eigentlich ist es, wenn das Schlüsselwort "löschen" verwendet wird. Denken Sie daran, dass das Schlüsselwort "new" "operator new" aufruft und dann den Konstruktor für die zurückgegebene Adresse aufruft, sodass es durchaus möglich ist, "neuen" Speicher auf dem Stapel zu erstellen. :) Das Schlüsselwort "delete" ruft den Destruktor auf und ruft dann "operator delete" auf.
Troubadour
@Jherico oder lebt im Namespace-Bereich oder ist ein statisches Klassenmitglied oder eine funktionslokale statische Variable: die statische Speicherdauer. Mit anderen Worten: Alle Vairables mit automatischer Speicherung werden bei Bedarf automatisch zerstört. Hüten Sie sich vor dem Fiasko
Sie den
4

Dies ist ein Destruktor. Es wird aufgerufen, wenn das Objekt zerstört wird (außerhalb des Lebensbereichs oder gelöscht).

Um klar zu sein, müssen Sie ~ NameOfTheClass wie für den Konstruktor verwenden, andere Namen sind ungültig.

Klaim
quelle
2
"andere Namen sind gültig"?
Leichtigkeitsrennen im Orbit
Alte Antwort ... Ich denke, ich meinte, dass nach ~ es ein beliebiger Name sein kann, solange es mit dem Klassennamen und dem Konstruktornamen identisch ist.
Klaim
2

Es ist der Zerstörer. Diese Methode wird aufgerufen, wenn die Instanz Ihrer Klasse zerstört wird:

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

Das wäre der Destruktor (der jeglichen dynamischen Speicher freigibt)

maxfridbe
quelle