コンストラクタとデストラクタの違い

著者: Laura McKinney
作成日: 1 4月 2021
更新日: 11 5月 2024
Anonim
【プログラミング講座(C#)】第30回 コンストラクタとデストラクタについて【独り言】
ビデオ: 【プログラミング講座(C#)】第30回 コンストラクタとデストラクタについて【独り言】

コンテンツ


コンストラクターとデストラクターは、クラスと同じ名前のメンバー関数です。前者のタイプ コンストラクタ オブジェクトの初期化に役立ちます。逆に、 デストラクタ 作成されたコンストラクタが役に立たないときに削除するコンストラクタとは異なります。

オブジェクトの一部を利用する前に初期化する必要がある場合があります。たとえば、スタックを操作している場合、アクションを実行する前に、スタックの最上部を常にゼロに設定する必要があります。自動初期化のこの機能は、「コンストラクター」を介して実行されます。たとえば、オブジェクトが破棄される前に何らかのコードを実行する必要がある場合。たとえば、オブジェクトが破壊する前に、開いていたファイルを閉じる必要がある場合。 「デストラクタ」の助けを借りて実行できます。

比較チャートを使用して、コンストラクタとデストラクタの基本的な違いをいくつか見てみましょう

  1. 比較表
  2. 定義
  3. 主な違い
  4. 結論

比較表:

比較の根拠コンストラクタデストラクタ
目的

オブジェクトにメモリを割り当てます。オブジェクトのメモリの割り当てを解除します。
宣言 class_name(引数がある場合は){};〜class_name(引数なし){};
引数 コンストラクターは引数を受け入れます デストラクタは引数を受け入れません。
呼び出し中コンストラクターは、オブジェクトの作成中に自動的に呼び出されます。ブロックが終了するか、プログラムが終了すると、デストラクタが自動的に呼び出されます。
ワーキングコンストラクターは、オブジェクトが使用される前にオブジェクトの値の一部を初期化することを許可します。デストラクタにより、オブジェクトはその破壊時に何らかのコードを実行できます。
実行の順序

コンストラクターは連続して呼び出されます。
デストラクタは、コンストラクタの逆の順序で呼び出されます。
数字で 1つのクラスに複数のコンストラクターを含めることができます。クラスには常に単一のデストラクタがあります。
コンストラクタをコピー コンストラクターのコピーにより、コンストラクターは別のオブジェクトからオブジェクトを宣言および初期化できます。そのような概念はありません。
オーバーロード コンストラクターはオーバーロードできます。デストラクタはオーバーロードできません。


コンストラクターの定義:

A コンストラクタ 基本的にはクラスのメンバー関数であり、オブジェクトを初期化してメモリを割り当てます。コンストラクターは、クラスと同じ名前で宣言および定義されているため、簡単に識別できます。コンストラクターには戻り値の型はありません。そのため、何も返されず、「void」も返されません。コンストラクターは、常にクラスのパブリックセクションで定義されます。

クラスには複数のコンストラクターを含めることができます。渡された引数の数とタイプに基づいて区別できます。クラスに複数のコンストラクターがある場合;暗黙のコンストラクター(do-nothingコンストラクター)は、それらとともに定義する必要があります。それは何もしませんが、コンパイラを満足させます。

コンストラクタは、デフォルトの引数で定義することもできます。一方、オブジェクトは「動的に」初期化されます。コンストラクタは継承も仮想化もできませんが、オーバーロードすることはできます。住所を参照することはできません。

コンストラクターの種類

基本的に、デフォルト、パラメータ化、およびコピーの各コンストラクタの3つのタイプのコンストラクタがあります。

  • デフォルトのコンストラクタ:コンストラクターに引数が与えられないコンストラクターです。デフォルトコンストラクターにはパラメーターはありませんが、デフォルトコンストラクターへの値はデフォルトで(動的に)渡すことができます。
  • パラメータ化されたコンストラクタ:このタイプのコンストラクターは引数を取ります。引数としてデータメンバーに異なる値を渡すことができます。
  • コンストラクタをコピー:コピーコンストラクターは、他のオブジェクトのアドレスを引数として受け入れるため、他のタイプのコンストラクターとは異なります。

コンストラクターの実装:

クラスConst {int a、b; public:Const()//パラメーターなしのコンストラクター{a = 0; b = 0; } Const(int c、int d){//パラメーターa = cを持つコンストラクター。 c = d; }}; int main(){Const C1; C2(10,20); //このステートメントはコンストラクタを呼び出します}

C1はパラメーターを渡さないため、C1が作成されると、パラメーターのないコンストラクターが実行されます。一方、C2が作成されると、2つの整数をコンストラクターに渡すため、パラメーターを持つコンストラクターが実行されます。


デストラクタの定義:

A デストラクタ オブジェクトに割り当てられたメモリの割り当てを解除するクラスのメンバー関数でもあります。クラスの名前と同じ名前で定義され、先頭に チルダ(〜) シンボル。デストラクタは、常にコンストラクタの逆の順序で呼び出されます。

引数を受け入れないため、クラスには常に1つのデストラクタがあります。ローカルオブジェクトは、実行の制御がブロックを離れるとすぐに破棄されます。一方、プログラム全体が終了すると、グローバルオブジェクトは破棄されます。デストラクタは、コンパイラによって暗黙的に呼び出されます。クラスが継承され、クラスが親クラスから派生し、子クラスと親クラスの両方にデストラクタがある場合。次に、派生クラスのデストラクタが最初に呼び出され、続いて親クラスのデストラクタが呼び出されます。

デストラクタの実装:

クラスConst {int a、b; public:Const(int c、int d)//パラメーターを持つコンストラクター。 {a = c; c = d; cout << "aおよびbの値は" <<>

C1オブジェクトが作成されると、整数型の2つのパラメーターを持つコンストラクターが呼び出され、メンバー「a、b」が初期化され、「a、b」の値が編集されます。そのデストラクタが呼び出された後、「オブジェクトC1が破壊されます」。

デストラクタの必要性

コンストラクタの作成は、最終的にオブジェクトにメモリを割り当てるため、ある程度のメモリ空間を消費します。この割り当てられたメモリは、オブジェクトを破棄して他のタスクのためにリソースを解放する前に割り当てを解除する必要があります。デストラクタは、オブジェクトを効果的に破棄し、メモリを解放するためのクリーンアップタスクを実行する目的に非常に役立ちます。

  1. コンストラクタの主な目的は、オブジェクトの作成時にメモリをオブジェクトに割り当てることです。反対に、デストラクタの主な目的は、オブジェクトが破棄されたときにオブジェクトのメモリの割り当てを解除することです。
  2. 引数を使用してクラスのデータメンバーを初期化できるため、コンストラクターは引数を受け入れることができます。一方、デストラクタは、オブジェクトのメモリの割り当てを解除することしかできないため、引数を受け入れません。
  3. コンストラクターは、オブジェクトが作成されるときに呼び出されます。対照的に、デストラクタは、プログラムが終了するか、プログラムがオブジェクトが作成されたブロックを出るときに呼び出されます。
  4. 通常、コンストラクタはクラスのデータメンバーを初期化するために使用されますが、デストラクタはオブジェクトが破棄される前に何らかのアクションを実行させるために使用されます。
  5. コンストラクターは連続した順序で実行されます。つまり、基本クラスを継承する派生クラスがあり、派生クラスのオブジェクトが作成される場合、最初に基本クラスのコンストラクターを呼び出し、次に派生クラスのコンストラクターを呼び出します。逆に、派生クラスのデストラクタが最初に呼び出され、次に基本クラスが呼び出されます。これは、デストラクタがコンストラクタの逆の順序で実行されることを意味します。
  6. クラスには、渡される引数の数によって識別される複数のコンストラクターがありますが、デストラクタは1つしか持てません。
  7. デストラクタにはそのような概念はありませんが、オブジェクトを別のオブジェクトから初期化できるコピーコンストラクタの概念があります。
  8. コンストラクターをオーバーロードして、同じコンストラクターの名前で異なるアクションを実行できます。それどころか、デストラクタはオーバーロードできません。

結論:

類似性に加えて、そのコンストラクタとデストラクタはクラスの特別なメンバー関数であり、同じ名前を持っています。両者の本質的な違いは、「コンストラクタ」はメモリ割り当て時に呼び出され、「デストラクタ」はオブジェクトのメモリ割り当て解除の時間。コンストラクターとデストラクターは、クラスで定義されていなくても、コンパイラーによって暗黙的に呼び出されます。