引数にオブジェクト宣言が設定された自作関数が実行された場合オブジェクトのコンストラクタは実行されませんが自作関数の終了に伴いオブジェクトのデストラクタは実行されます


🌞    🌞    🌞    🌞    🌞    🌞    🌞    



   天気がいいな~   最高に気持ちいい~



🌞    🌞    🌞    🌞    🌞    🌞    🌞  



ぶーにゃん「にゃ~~ん」


マックス「int(イント) どうだ この俺の特製そばの味は?」


int(イント)「う、うう~ん」



てんC「int(イント)さん  うどんも用意してあります」


ぶーにゃん「にゃ~~ん」


int(イント)「う、ううど~ん」



マックス「だ~はっは~ よかったな~ 」


ソーラー「・・・( ^ω^)・・・


お、面白いかも・・・」


ソーラー「


さて


引数にオブジェクト宣言が設定された自作関数に

main関数内で作製されたオブジェクトを代入して

自作関数を実行してみましたね


その場合


引数にオブジェクト宣言が記述されていることにより


オブジェクトが生成されますが


オブジェクトのコンストラクタは実行されません


ですが


自作関数の実行の終了にともない


オブジェクトが消去されるときは


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


そのことを


考察してみたいと思います


次のプログラムをご覧ください


#include <iostream>


using namespace std;


class Suuti{


public:


int x;


public:


Suuti();


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


public:


void suutidisplay();


//🌞🌞🌞suutidisplay()のメンバ関数宣言を行っています🌞🌞🌞


public:


~Suuti();


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


};


Suuti::Suuti() {


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



}


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


Suuti::~Suuti() {


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


}


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



void newmadefunction(Suuti a) {


cout << "自作関数が実行されました" << "\n";


cout << a.x << "\n";

}


//👆🌞🌞🌞自作関数newmadefunctionの引数としてaのSuuti型のオブジェクト宣言Suuti aを行っています🌞🌞🌞


int main() {


Suuti b;


b.x = 1;


newmadefunction(b);


return 0;

}


プログラムの実行結果


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

自作関数が実行されました

1

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

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


マックス「なになに


順を追っていくと・・


このプログラムでは


まず


Suuti b;


によりクラスSuuti型のオブジェクトbが作製されているんだろう


なので


クラスSuuti型のオブジェクトbのメンバ関数である


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


が実行されて


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


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


が表示されるわけだ


そして


クラスSuuti型のオブジェクトbのメンバ変数


b.xに数値データ1が代入されている


次に


newmadefunction(b);


が実行されると


クラスSuuti型のオブジェクトbが


自作関数newmadefunctionの引数となっている


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


Suuti a


に代入された状態で


自作関数newmadefunctionの定義

👇

void newmadefunction(Suuti a) {


cout << "自作関数が実行されました" << "\n";

cout <<a.x << "\n";

}


内の


命令文


cout << "自作関数が実行されました" << "\n";

cout <<a.x << "\n";


が実行されるんだろう」


ソーラー「そうなんです


そして


自作関数の引数となっている


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


Suuti a



main関数内で作製されたクラスSuuti型のオブジェクトbが代入されると


クラスSuuti型のオブジェクトaのメンバ変数


a.x



クラスSuuti型のオブジェクトbのメンバ変数


b.x


が持っている数値データ1が代入されます


ですので


cout << "自作関数が実行されました" << "\n";

cout <<a.x << "\n";


が実行されると


自作関数が実行されました

1



コマンドプロンプト画面に表示されることになります



            このとき!


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


Suuti a


が実行されているので


クラスSuuti型のオブジェクトaのコンストラクタが実行されて


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



コマンドプロンプト画面に表示されそうなものですが


表示されません


しかし


自作関数newmadefunctionの実行終了にともない


クラスSuuti型のオブジェクトaが消去されるとき


クラスSuuti型のオブジェクトaのデストラクタが実行されて


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



コマンドプロンプト画面に表示されます


つまり


引数にオブジェクト宣言が設定された自作関数に

main関数内で作製されたオブジェクトを代入して

自作関数を実行した場合


引数のオブジェクト宣言によって生成されるオブジェクトのメンバ変数に


main関数内で生成されたオブジェクトのメンバ変数が格納している値が代入される


値渡しが実行されますが


そのとき


引数のオブジェクト宣言により生成されるオブジェクトのコンストラクタは


実行されませんが


自作関数の実行終了にともない


引数のオブジェクト宣言により生成されるオブジェクトが消去されると


オブジェクトのデストラクタは


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


マックス「ふ~ん そういう仕組みなのか」


ソーラー「そして


プログラムの実行が終了すると


main関数内で


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


Suuti b;


により


生成されたクラスSuuti型のオブジェクトb



消去されます


そのとき


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


実行されて


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


がコマンドプロンプト画面に表示されます


結局


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

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


の実行により


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


が連続して


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

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



コマンドプロンプト画面に表示されていますね」


マックス「


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

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


の違いってなんだ?



int(イント)「?そうだね なんだろう」


ソーラー「


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



クラスSuuti型のオブジェクトaのメンバ関数なんです


今のプログラムのように


自作関数の実行にともない


クラスSuuti型のオブジェクトaが生成されて


自作関数の実行終了にともない


クラスSuuti型のオブジェクトaが消去されるとき


クラスSuuti型のオブジェクトaのメンバ関数であるデストラクタが実行されます


そのとき


クラスSuuti型のオブジェクトaのメンバ変数a.xが


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

👇

Suuti::~Suuti() {


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



}


内の


クラスのメンバ変数xの部分に代入されたものが実行されます



このデストラクタの定義には


クラスのメンバ変数xが記述されていないので



そのまま


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


が実行されて


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


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


が表示されることになります



同様に


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



クラスSuuti型のオブジェクトbのメンバ関数なんです


今のプログラムのように


main関数の実行にともない


クラスSuuti型のオブジェクトbが生成されて


main関数の実行終了にともない


クラスSuuti型のオブジェクトbが消去されるとき


クラスSuuti型のオブジェクトbのメンバ関数であるデストラクタが実行されます


そのとき


クラスSuuti型のオブジェクトbのメンバ変数b.xが


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

👇

Suuti::~Suuti() {


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



}


内の


クラスのメンバ変数xの部分に代入されたものが実行されます



このデストラクタの定義には


クラスのメンバ変数xが記述されていないので



そのまま


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


が実行されて


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


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


が表示されることになります」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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