![](http://gadget-info.com/img/difference-between/750/difference-between-constructor.jpg)
比較チャートを使って、コンストラクタとデストラクタの基本的な違いをいくつか概説しましょう。
比較表:
比較基準 | コンストラクタ | デストラクタ |
---|---|---|
目的 | メモリをオブジェクトに割り当てます。 | オブジェクトのメモリを解放します。 |
宣言 | class_name(もしあれば引数){}; | 〜class_name(引数なし){}; |
引数 | コンストラクタは引数を受け入れます | デストラクタは引数を受け入れません。 |
呼び出し | オブジェクトの作成中にコンストラクタが自動的に呼び出されます。 | ブロックが終了するかプログラムが終了すると、デストラクタが自動的に呼び出されます。 |
ワーキング | コンストラクタはオブジェクトがその値の一部を初期化することを可能にし、それが使用されます。 | Destructorは、オブジェクトがその破壊時に何らかのコードを実行することを可能にします。 |
実行順序 | コンストラクタは順番に呼び出されます。 | デストラクタはコンストラクタの逆順で呼び出されます。 |
数字で | クラスには複数のコンストラクタがあります。 | しかし、クラスには常に単一のデストラクタがあります。 |
コピーコンストラクタ | コピーコンストラクタを使用すると、コンストラクタは別のオブジェクトからオブジェクトを宣言して初期化できます。 | そのような概念はありません。 |
オーバーロード | コンストラクタは過負荷になる可能性があります。 | デストラクタはオーバーロードできません。 |
コンストラクタの定義:
コンストラクタは基本的にclassのメンバ関数で、オブジェクトを初期化しそれにメモリを割り当てます。 コンストラクタは、クラスの名前と同じ名前で宣言および定義されているため、簡単に識別できます。 コンストラクターは戻り型を持ちません。 それで、彼らは何も返しませんし、 'void'さえも返しません。 コンストラクタは常にクラスのパブリックセクションで定義されます。
クラスには複数のコンストラクタが存在できます。 それらは、渡された引数の数と種類に基づいて区別できます。 クラスに複数のコンストラクタがある場合 暗黙的なコンストラクタ(何もしないコンストラクタ)もそれらと一緒に定義する必要があります。 それは何もしませんが、コンパイラを満足させます。
コンストラクタはデフォルトの引数で定義することもできます。 一方、それらはオブジェクトを「動的に」初期化します。 コンストラクタは継承することも仮想的にすることもできませんが、オーバーロードすることができます。 彼らは自分の住所を参照することはできません。
コンストラクタの実装
クラスConst {int a、b; public:Const(){//パラメータなしのコンストラクタa = 0; b = 0。 } Const(int c、int d){//パラメータa = cを持つコンストラクタ。 c = d。 ;}}; int main(){定数C1; C2(10,20); //この文はコンストラクタを呼び出します}
C1が作成されると、C1はパラメータを渡さないので、パラメータのないコンストラクタが実行されます。 これに対して、C2が作成されると、コンストラクタに2つの整数が渡されるため、パラメータを持つコンストラクタが実行されます。
デストラクタの定義:
デストラクタもクラスのメンバ関数で、オブジェクトに割り当てられているメモリの割り当てを解除します。 これはクラスの名前と同じ名前で定義され、先頭にチルダ(〜)記号が付きます。 デストラクタは常にコンストラクタの逆順で呼び出されます。
引数を受け取らないため、クラス内には常に単一のデストラクタがあります。 実行の制御がブロックを解除するとすぐに、ローカルオブジェクトは破棄されます。 一方、プログラム全体が終了すると、グローバルオブジェクトは破棄されます。 デストラクタは、コンパイラによって暗黙的に呼び出されます。 クラスが継承され、クラスが親クラスから派生し、子クラスと親クラスの両方にデストラクタがある場合。 次に、派生クラスのデストラクタが最初に呼び出され、次に親クラスのデストラクタが呼び出されます。
デストラクタの実装
クラス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つだけあります。
- あるオブジェクトが別のオブジェクトから初期化されることを可能にするコピーコンストラクタという概念がありますが、デストラクタにはそのような概念はありません。
- コンストラクタは、同じコンストラクタの名前で異なるアクションを実行するためにオーバーロードすることができますが、デストラクタはオーバーロードすることはできません。
結論:
類似性の他に、そのコンストラクタとデストラクタはクラスの特別なメンバ関数であり、同じ名前を持っています、両者の基本的な違いは、 'コンストラクタ'はメモリ割り当て時に呼び出され、 'デストラクタ'はそのときに呼び出されるということです。オブジェクトのメモリ解放の時間。 コンストラクタとデストラクタはどちらも、クラス内で定義されていなくても、コンパイラによって暗黙的に呼び出されます。