C++ のデストラクター
デストラクターとは何ですか?
Destructor は、オブジェクトが破棄されるたびに自動的に呼び出されるインスタンス メンバー関数です。つまり、デストラクターは、オブジェクトが破棄される前に呼び出される最後の関数です。
- デストラクターもコンストラクターと同様に特別なメンバー関数です。デストラクターは、コンストラクターによって作成されたクラス オブジェクトを破棄します。
- デストラクターの名前は、クラス名の前にチルダ (~) 記号が付いているものと同じです。
- 複数のデストラクターを定義することはできません。
- デストラクターは、コンストラクターによって作成されたオブジェクトを破棄する 1 つの方法にすぎません。したがって、デストラクターをオーバーロードすることはできません。
- デストラクターは引数を必要とせず、値を返しません。
- オブジェクトがスコープ外になると、自動的に呼び出されます。
- デストラクターは、コンストラクターによって作成されたオブジェクトによって占有されているメモリ領域を解放します。
- デストラクターでは、オブジェクトの作成とは逆の手順でオブジェクトが破棄されます。
ここで注意すべき点は、オブジェクトが new を使用して作成された場合、またはコンストラクターが new を使用してヒープ メモリまたはフリー ストアに存在するメモリを割り当てる場合、デストラクターはメモリを解放するために delete を使用する必要があることです。
構文
クラス内でデストラクターを定義するための構文は次のとおりです。
~ () { // some instructions } クラスの外でデストラクターを定義するための構文は次のとおりです。
:: ~() { // some instructions } 例1
以下のコードは、オブジェクトの作成時と破棄時のコンストラクターとデストラクターの自動実行を示しています。
C++
// C++ program to demonstrate the execution of constructor> // and destructor> #include> using> namespace> std;> class> Test {> public> :> > // User-Defined Constructor> > Test() { cout < <> '
Constructor executed'> ; }> > // User-Defined Destructor> > ~Test() { cout < <> '
Destructor executed'> ; }> };> main()> {> > Test t;> > return> 0;> }> |
出力
Constructor executed Destructor executed
例 2
以下のコードは、複数のオブジェクトがそれぞれ作成および破棄されるたびに、コンストラクターとデストラクターが自動的に実行されることを示しています。
C++
// C++ program to demonstrate the execution of constructor> // and destructor when multiple objects are created> #include> using> namespace> std;> class> Test {> public> :> > // User-Defined Constructor> > Test() { cout < <> '
Constructor executed'> ; }> > // User-Defined Destructor> > ~Test() { cout < <> '
Destructor executed'> ; }> };> main()> {> > // Create multiple objects of the Test class> > Test t, t1, t2, t3;> > return> 0;> }> |
出力
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed
例 3
以下の C++ プログラムは、コンストラクターとデストラクターが呼び出される回数を示しています。
C++
// C++ program to demonstrate the number of times> // constructor and destructors are called> #include> using> namespace> std;> static> int> Count = 0;> //It is static so that every class object has the same value> class> Test {> public> :> > // User-Defined Constructor> > Test()> > {> > // Number of times constructor is called> > Count++;> > cout < <> 'No. of Object created: '> < < Count> > < < endl;> > }> > // User-Defined Destructor> > ~Test()> > {> > > cout < <> 'No. of Object destroyed: '> < < Count> //It will print count in> > < < endl;> //decending order> > Count--;> > // Number of times destructor is called> > }> };> // driver code> int> main()> {> > Test t, t1, t2, t3;> > return> 0;> }> |
出力
No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1
注記: オブジェクトは作成時とは逆の順序で破棄されます。この場合、t3 が最初に破棄され、t が最後に破棄されます。
デストラクターのプロパティ
デストラクターの主なプロパティは次のとおりです。
- デストラクター関数は、オブジェクトが破棄されるときに自動的に呼び出されます。
- static または const として宣言することはできません。
- デストラクターには引数がありません。
- 戻り値の型はなく、void さえありません。
- デストラクターを持つクラスのオブジェクトは、共用体のメンバーになることはできません。
- デストラクターはクラスの public セクションで宣言する必要があります。
- プログラマはデストラクタのアドレスにアクセスできません。
デストラクターはいつ呼び出されますか?
オブジェクトがスコープ外に出ると、デストラクター関数が自動的に呼び出されます。
- 機能は終了します
- プログラムは終了します
- ローカル変数を含むブロックが終了する
- 削除演算子が呼び出されます
注記: 駆逐艦 オブジェクトに対して明示的に呼び出すこともできます。
デストラクターを明示的に呼び出すにはどうすればよいですか?
次のステートメントを使用して、デストラクターを明示的に呼び出すことができます。
object_name.~class_name()
デストラクターは通常のメンバー関数とどう違うのでしょうか?
- デストラクターは、クラスと同じ名前の前にチルダ (~) が付きます。
- デストラクターは引数を受け取らず、何も返しません
C++
#include> using> namespace> std;> class> String {> private> :> > char> * s;> > int> size;> public> :> > String(> char> *);> // constructor> > ~String();> // destructor> };> String::String(> char> * c)> {> > size => strlen> (c);> > s => new> char> [size + 1];> > strcpy> (s, c);> }> String::~String() {> delete> [] s; }> int> main()> {> > String str => 'Hello, World!'> ;> > String myString(str);> > cout < <> 'String: '> < < myString.s < < endl;> > return> 0;> }> |
クラス内に複数のデストラクターを含めることはできますか?
いいえ、クラス名の前に ~ が付き、パラメーターや戻り値の型を持たないクラス内にデストラクターは 1 つだけ存在できます。
ユーザー定義のデストラクターを作成する必要があるのはどのような場合ですか?
クラス内に独自のデストラクターを作成しない場合、コンパイラーはデフォルトのデストラクターを作成します。クラス内でメモリまたはポインタを動的に割り当てない限り、デフォルトのデストラクタは正常に動作します。クラスに割り当てられたメモリへのポインタがクラスに含まれている場合、クラス インスタンスが破棄される前にメモリを解放するデストラクタを作成する必要があります。これはメモリ リークを避けるために行う必要があります。
デストラクターは仮想化できますか?
はい、実際、仮想関数がある場合、基本クラスでデストラクターを仮想化することは常に良い考えです。詳細については、「仮想デストラクター」を参照してください。
デストラクターに関するクイズに答えてみるとよいでしょう。
関連記事
- C++ のコンストラクター
- バーチャルデストロイヤー
- C++ の純粋な仮想デストラクター