前のセクションで説明したように、クラスオブジェクトが作成されるときに自動的に呼び出されるコンストラクターに加えて、オブジェクトが破棄されるときにも自動的に呼び出される関数も、クラス名と同じ名前を持ち、戻り値はありません。名前の前にチルダ ~が付いています。 用途 コンストラクターを区別するために、その関数は主にオブジェクトが解放された後の処理をクリーンアップするために使用されます。それはデストラクターです。
コンストラクターやクラス名と同様に、ユーザーが定義しない場合は、システムが自動的に空のデストラクターを生成します。ユーザーが定義すると、オブジェクトが破棄されるときに自動的に呼び出されます。
コンストラクターとは異なりますが、どちらもパブリック型です。構築はオーバーロードでき、複数の兄弟を持つことができますが、デストラクターはオーバーロードできませんが、仮想関数にすることができ、クラスはデストラクターを 1 つだけ持つことができます。
次に、Student クラスを例としてデストラクターを追加します。同時に、どのクラスが作成され破棄されるかを識別するために、コンストラクターとデストラクターの両方に現在のクラスに関する情報を追加します。コードをよく読んでください。 :
#include<iostream>#include<Cstring>usingnamespacestd;classStudent{private:intnum;//学生番号 charname[100];//名前 intscore;//スコア public:Student(intn,char*str,ints);~Student ();intprint();intSet(intn,char*str,ints);};Student::Student(intn,char*str,ints){num=n;strcpy(name,str);score=s;cout <<num<<<<name<<<<score<<;cout<<Constructor<<endl;}Student::~Student(){cout<<num<<<<name<<<<score<<; cout<<destructor<<endl;}intStudent::print(){cout<<num<<<<name<<<<score<<endl;return0;}intStudent::Set(intn,char*str,ints) {num=n;strcpy(name,str);score=s;}intmain(){StudentA(100,dot,11);StudentB(101,cpp,12);return0;}
上記のコードのコンストラクターとデストラクターをよく理解し、main 関数で 2 つのオブジェクト A と B が定義されていることに注意して、自分のコンピューターでテストしてください。実行時の効果は次のとおりです。
オブジェクト A と B のコンストラクターを呼び出す順序とデストラクターを呼び出す順序がまったく逆であることがわかります。その理由は、オブジェクト A と B はどちらもローカル オブジェクトであり、スタック領域にも格納されており、「先入れ後出し」の順序に従っているためです。
ぜひご自身でテストして結果をご確認ください。