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

~ ist der bitweise Negationsoperator. Wenn man sie auf eine Funktionsdefinition anwendet, bedeutet dies, dass die Funktion das * entgegengesetzte * von dem ausführt, was sie sagt - also zum Beispiel wird "~ push()' den Stapel wirklich platzen lassen und '~ writeSeriousComment()' wird tatsächlich solche Kommentare produzieren. –

+29

Zum Wohle der Art von Person, die die meisten der C++ Fragen auf dieser Seite zu schreiben scheint, versuchen Sie nicht j_random_hacker Kommentar zu lesen. – Alan

+34

zum Vorteil von Menschen, die einen Sinn für Humor (und einige grundlegende Programmierkenntnisse) haben DO versuchen, j_random_hacker Kommentar zu lesen. –

Antwort

104

Es ist die destructor, es die Instanz zerstört, entlastet Speicher usw. usw.

Hier eine Beschreibung von ibm.com ist:

Destruktoren werden in der Regel freizugeben Speicher und tun andere Bereinigungen verwendet für ein Klassenobjekt und seine Klassenmitglieder, wenn das Objekt zerstört wird. Ein Destruktor wird für ein Klassenobjekt aufgerufen, wenn dieses Objekt den Gültigkeitsbereich überschreitet oder explizit gelöscht wird.

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

3

Dies ist ein destructor ist. Es wird aufgerufen, wenn das Objekt zerstört wird (außerhalb des Gültigkeitsbereichs oder gelöscht).

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

+2

"andere Namen sind gültig"? –

+0

Alte Antwort ... Ich glaube ich meinte, dass nach ~ es ein beliebiger Name sein könnte, solange es der Klassenname und der Konstruktorname ist. – Klaim

5

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

+1

... wenn es auf dem Stapel zugeordnet ist.Wenn 'delete' für das Objekt aufgerufen wird, wenn es auf dem Heap zugeordnet ist. – Jherico

+0

@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 auf die zurückgegebene Adresse aufruft, so dass es vollkommen möglich ist, "neuen" Speicher auf dem Stapel zu speichern. :) Das Schlüsselwort "delete" ruft den Destruktor auf und ruft dann "operator delete" auf. – Troubadour

+0

@Herico oder lebt im Namespace-Bereich oder ist ein statisches Klassenmitglied oder eine funktionale lokale statische Variable: die statische Speicherdauer. Mit anderen Worten: Alle Variablen mit automatischem Speicher werden _automatisch_ bei Bedarf zerstört. Vorsicht vor [Statischer Initialisierungsauftrag Fiasko] (http://stackoverflow.com/a/1005709/85371) – sehe

1

Das ist der destructor würde (zu befreien jeden dynamischen Speicher up)

2

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

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

Es gibt ein * fehlt. – Klaim

+0

hops .. danke :-) – Pierre

52

Wie andere erwähnt haben, in dem Fall, Sie fragen, darüber der destructor für class Stack ist.

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

in C++, was eine Tilde bedeutet „~“, bevor ein Funktionsnamen bedeuten?

gibt es eine andere Situation. In jedem Kontext außer unmittelbar vor dem Namen einer Klasse (der destructor Kontext ist), ~ das Einerkomplement (oder bitweise nicht) Operator. Um sicherzustellen, dass es nicht sehr oft kommen, aber Sie können einen Fall wie

if (~getMask()) { ... 

vorstellen, die ähnlich aussehen, haben aber eine ganz andere Bedeutung.