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

〜はビット単位の否定演算子です。関数定義に適用すると、関数はそれが行うことの反対の*を行うことを意味します。例えば、 '〜push()'は実際にスタックをポップし、 '〜writeSeriousComment()'このようなコメントを実際に生成します。 –

+29

このサイトでC++の質問のほとんどを投稿しているような人のために、j_random_hackerのコメントを読もうとしないでください。ユーモア(そして何らかの基本的なプログラミング知識)を持つ人々の利益のために – Alan

+34

はj_random_hackerのコメントを読もうとします。 –

答えて

104

それはデストラクタだ、それはなど、インスタンスが破棄されたメモリを解放など

ここibm.comからの説明です:

デストラクタは通常、メモリを解放し、その他のクリーンアップを行うために使用されていますオブジェクトが破壊されたときのクラスオブジェクトとそのクラスメンバデストラクタは、クラスオブジェクトがスコープから外れたとき、または明示的に削除されたときに呼び出されます。

これはデストラクタでhttps://www.ibm.com/support/knowledgecenter/SSB27U_5.4.0/com.ibm.zos.r9.cbclx01/cplr380.htm

3

を参照してください。これは、オブジェクトが破棄されたときに呼び出されます(有効範囲外または削除されたとき)。

明確にするには、〜NameOfTheClassをコンストラクタのように使用する必要があります。他の名前は無効です。

+2

「他の名前は有効ですか? –

+0

古い答え...私はそれが〜の後ではどんな名前でも構いませんが、それはクラス名とコンストラクター名と同じであることを意味すると思います。 – Klaim

5

デストラクタです。この関数は、オブジェクトがスコープ外に出たときに呼び出されることが保証されています。

+1

...スタックに割り当てられている場合。ヒープ上に割り当てられているオブジェクトに対して 'delete'が呼び出されたとき。 – Jherico

+0

@Jherico:実際には、キーワード「削除」が使用されています。キーワード "new"は "operator new"を呼び出し、返されたアドレスのコンストラクタを呼び出して、スタック上の "新しい"メモリが完全に可能であることを覚えておいてください。 :)キーワード "delete"はデストラクタを呼び出し、 "operator delete"を呼び出します。 – Troubadour

+0

@Jhericoまたはnamespaceスコープに存在するか、静的なクラスメンバーまたは関数ローカルの静的変数です。静的な記憶期間です。言い換えれば、オートストレージを備えたすべてのヴァイラブルは、自動的に適切なときに破棄されます。 [Static Initialization Order Fiasco](http://stackoverflow.com/a/1005709/85371)にご注意ください。 – sehe

1

デストラクタ(ダイナミックメモリを解放する)

2

デストラクタです。他の人が指摘したように、インスタンスで、あなたはそれについて尋ねている、

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

*がありません。 – Klaim

+0

ホップ..ありがとう:-) – Pierre

52

class Stackのデストラクタです:このメソッドは、クラスのインスタンスが破棄されたときに呼び出されます。

しかし、それはタイトルに表示されているとおり、あなたの質問を取る:

C++ではチルダを何「〜」関数名は意味の前に?

別の状況があります。どんな文脈でも、クラス名(デストラクタコンテキスト)の直前のを除くでは、~は1の補数(またはビット単位ではない)演算子です。それは非常に頻繁に出てくるしません確かに、しかし、あなたは似ていますが、非常に異なる意味を持ち

if (~getMask()) { ... 

のようなケースを想像することができます。

関連する問題