クラスのメンバ関数としてデストラクタが設定されているとプログラムが終了したときやオブジェクトが消去されるときオブジェクトのデストラクタが🍎自動的🍎に実行されます

ソーラー「動的にメモリを確保するお話に続いて


今度はデストラクタのお話です」


マックス「おお 今度はなんだ?」


int(イント)「なになに?ねえ、てんCさん?」


てんC「 int(イント)さん


今度はどんな話題が登場してくるのでしょうか?楽しみですね」


ソーラー「コンストラクタとはクラスのメンバ関数であり


オブジェクトが


生成されると


             自動的に


 😊コンストラクタの定義内のクラスのメンバ変数の部分に😊


   😊生成されたオブジェクトのメンバ変数が代入された😊


オブジェクトのコンストラクタが実行されます


そのことを示すプログラムはこちらです。

👇


#include <iostream>


using namespace std;


class Suuti{


public:


int x;


public:


Suuti();


//🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞


public:


void suutidisplay();


};


Suuti::Suuti() {


cout << "オブジェクトのコンストラクタが実行されました" << "\n";


x = 0;


cout <<"生成されたオブジェクトのメンバ変数が"<<x<<"に初期化されました"<< "\n";


}

//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞


void Suuti::suutidisplay() {


cout << x << "\n";


}



int main() {


Suuti a;


return 0;


}


プログラムの実行結果


オブジェクトのコンストラクタが実行されました

生成されたオブジェクトのメンバ変数が0に初期化されました


ソーラー「このプログラムでは


aのSuuti型のオブジェクト宣言


Suuti a;


の実行により


クラスSuuti型のオブジェクトa


が生成されています


このとき


自動的に


コンストラクタの定義

👇

Suuti::Suuti() {


cout << "オブジェクトのコンストラクタが実行されました" << "\n";


x = 0;


cout <<"生成されたオブジェクトのメンバ変数を"<<x<<"に初期化しました"<< "\n";


}


のxに


生成されたクラスSuuti型のオブジェクトaのメンバ変数


a.x


が代入された


cout << "オブジェクトのコンストラクタが実行されました" << "\n";


a.x = 0;


cout <<"生成されたオブジェクトのメンバ変数が"<<a.x<<"に初期化されました"<< "\n";


が実行されることになります


ですので


コマンドプロンプト画面に


オブジェクトのコンストラクタが実行されました

生成されたオブジェクトのメンバ変数が0に初期化されました


が表示されます



この


コンストラクタに対し




         🌷デストラクタ🌷



というものが存在します



         🌷デストラクタ🌷



とはクラスのメンバ関数のことであり



         🌷デストラクタ🌷




クラスのメンバ関数として設定されていると


オブジェクトがメモリから消去されるときや


プログラムが終了するときに


       😊デストラクタの定義内のクラスのメンバ変数の部分に😊


     😊メモリから消去されるオブジェクトのメンバ変数が代入された😊


           😊オブジェクトのデストラクタが😊



                😊自動的に😊



実行されることになります」


マックス「うむう?」


ソーラー「


デストラクタとはクラスのメンバ関数であり


デストラクタとはクラスのメンバ関数なので


クラス宣言内でメンバ関数宣言されている必要があります


たとえば


クラスSuutiに


メンバ関数であるデストラクタを設定するとします


そのとき


クラスSuutiのデストラクタ名は


クラスSuutiに


~(チルダ)がつけられた


~Suutiで表されます


自分でデストラクタの名前を自由に設定することはできません


そして


デストラクタのメンバ関数宣言は


~Suuti();


と記述して


引数を持たないタイプのデストラクタのメンバ関数宣言を


行うことになります


引数を持つタイプのデストラクタのメンバ関数宣言は


実行することができないよう設定になっています


そして


クラスSuutiのメンバ関数であるデストラクタ


~Suuti()の定義は

👇

Suuti::~Suuti(){


設定したい命令文


}

👆

のように設定されることになります


クラスSuutiのメンバ関数であるデストラクタ~Suuti()の定義をみてもわかるように


クラスSuutiのメンバ関数であるデストラクタ~Suuti()が


クラスSuutiのメンバ関数であることを示すために


クラスSuutiに


スコープ解決演算子::


が用いられた


Suuti::


が~Suuti()に


Suuti::~Suuti()と


くっつけられています



それでは


先程のプログラムで用いられた


クラスSuutiに


新たにクラスSuutiのメンバ関数であるデストラクタ


~Suuti()



追加して設定したプログラムを実行してみます


そのプログラムはこちらです

👇


#include <iostream>


using namespace std;


class Suuti{


public:


int x;


public:


Suuti();


//🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞


public:


void suutidisplay();


public:


~Suuti();

//🌞🌞🌞デストラクタのメンバ関数宣言を行っています🌞🌞🌞


};


Suuti::Suuti() {


cout << "オブジェクトのコンストラクタが実行されました" << "\n";


x = 0;


cout << "生成されたオブジェクトのメンバ変数が" << x << "に初期化されました" << "\n";


}

//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞


void Suuti::suutidisplay() {


cout << x << "\n";


}


Suuti::~Suuti() {


cout << "オブジェクトのデストラクタが実行されました" << "\n";

x = 1;


cout << "オブジェクトのメンバ変数に" << x << "が代入されました" << "\n";

}

//👆🌞🌞🌞デストラクタの定義を行っています🌞🌞🌞



int main() {


Suuti a;


return 0;


}


プログラムの実行結果


オブジェクトのコンストラクタが実行されました

生成されたオブジェクトのメンバ変数が0に初期化されました

オブジェクトのデストラクタが実行されました

オブジェクトのメンバ変数に1が代入されました


ソーラー「ふふっ シンプルっ


このプログラムでは


aのクラスSuuti型のオブジェクト宣言


Suuti a;


が実行されているだけです(^_-)-☆


Suuti a;


が実行されると



まず



 😊コンストラクタSuuti()の定義内のクラスのメンバ変数xの部分に😊


   😊生成されたクラスSuuti型のオブジェクトaのメンバ変数a.xが代入された😊


クラスSuuti型のオブジェクトaのコンストラクタが



            😊自動的に😊



実行されます」



マックス「う、うむぅ」



ソーラー「


つまり


クラスSuutiのメンバ関数であるコンストラクタSuuti()の定義

👇


Suuti::Suuti() {


cout << "オブジェクトのコンストラクタが実行されました" << "\n";


x = 0;


cout << "生成されたオブジェクトのメンバ変数が" << x << "に初期化されました" << "\n";


}


x

a.x

が代入された


cout << "オブジェクトのコンストラクタが実行されました" << "\n";


a.x = 0;


cout << "生成されたオブジェクトのメンバ変数が" <<a. x << "に初期化されました" << "\n";


が実行されることになるので


コマンドプロンプト画面に


オブジェクトのコンストラクタが実行されました

生成されたオブジェクトのメンバ変数が0に初期化されました


が表示されます


そして


プログラムの終了となるわけですが


そのとき


 😊デストラクタ~Suuti()の定義内のクラスのメンバ変数xの部分に😊


   😊メモリから消去されるクラスSuuti型のオブジェクトaのメンバ変数a.xが代入された😊


クラスSuuti型のオブジェクトaのデストラクタが



            😊自動的に😊



実行されます


つまり


クラスSuutiのメンバ関数であるデストラクタの定義

👇


Suuti::~Suuti() {


cout << "オブジェクトのデストラクタが実行されました" << "\n";


x = 1;


cout << "オブジェクトのメンバ変数に" << x << "が代入されました" << "\n";

}


x

a.x

が代入された


cout << "オブジェクトのデストラクタが実行されました" << "\n";


a.x = 1;


cout << "オブジェクトのメンバ変数に" << a.x << "が代入されました" << "\n";


が実行されることになるので


コマンドプロンプト画面に


オブジェクトのデストラクタが実行されました

オブジェクトのメンバ変数に1が代入されました


が表示されます」


マックス「デストラクタとはなんのことかと思ったが


おもったより仕組みは簡単だな(*^▽^*)


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る