C ++では、関数名の前のチルダ「〜」は何を示していますか?


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 ;  
 } ;

回答:


150

これはデストラクタであり、インスタンスを破棄したり、メモリを解放したりします。

ibm.comの説明は次のとおりです。

デストラクタは通常、メモリの割り当てを解除し、オブジェクトが破棄されたときにクラスオブジェクトとそのクラスメンバーに対して他のクリーンアップを実行するために使用されます。デストラクタは、クラスオブジェクトがスコープ外に渡されたとき、または明示的に削除されたときに呼び出されます。

https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzarg/cplr380.htmを参照してください


1
このリンクは現在壊れています。
zenofpython 2019

2
@zenofpython修正されました!
inanutshellus

75

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

しかし、タイトルに表示されているとおりに正確に質問してください。

C ++では、関数名の前のチルダ「〜」は何を示していますか?

別の状況があります。クラスの名前の直前(デストラクタコンテキスト)を除くすべてのコンテキストで~は、1の補数(またはビット単位ではない)演算子です。確かにそれはあまり頻繁には出てきませんが、あなたは次のようなケースを想像することができます

if (~getMask()) { ...

似ていますが、意味が大きく異なります。


8

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


2
...スタックに割り当てられている場合。オブジェクトがヒープに割り当てられている場合、オブジェクトで「delete」が呼び出されたとき。
ジェリコ2009

@ジェリコ:実際には、キーワード「削除」が使用されたときです。キーワード「new」は「operator new」を呼び出し、次に返されたアドレスでコンストラクターを呼び出すため、スタックの「新しい」メモリを完全に作成できることに注意してください。:)キーワード "delete"はデストラクタを呼び出し、次に "operator delete"を呼び出します。
トルバドゥール

@Jhericoまたは名前空間スコープに存在するか、静的クラスメンバーまたは関数ローカルの静的変数:静的ストレージ期間。つまり、自動ストレージを備えたすべてのvairableは、適切なときに自動的に破棄されます。静的初期化命令Fiascoに
sehe

4

これはデストラクタです。オブジェクトが破棄されたときに呼び出されます(有効期間外または削除された場合)。

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


2
「他の名前も有効」?
Orbitでの軽さのレース

古い答え...私はそれがクラス名とコンストラクタ名と同じである限り、任意の名前にすることができることを意味したと思います。
Klaim

2

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.