オブジェクト宣言を実行した場合はオブジェクトのコンストラクタが実行されますがオブジェクト宣言、初期化を実行した場合はオブジェクトのコンストラクタは実行されません

そもそも引数にオブジェクト宣言が設定された自作関数に main関数内で作製されたオブジェクトを代入して 自作関数を実行した場合 オブジェクトのコンストラクタを実行されるようにすることはできません

ソーラー「


さて


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

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

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

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


ソーラー「

もし


自作関数の実行時に

オブジェクトのコンストラクタが実行されていたなら


プログラムの実行結果は


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

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

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

1

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

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


と表示されそうなものですね」


マックス「ふ~む そうだな」


ソーラー「では


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

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

自作関数を実行した場合


オブジェクトのコンストラクタが実行されるように


するには


どうしたらいいかということですね」


マックス「ふむふむ まあそうだな」


ソーラー「


実は


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

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

自作関数を実行した場合


オブジェクトのコンストラクタが実行されるように


することはできません。」


マックス「そんな仕組みなのか じゃあしょうがな~い」


ソーラー「確かに


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

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

自作関数を実行した場合


オブジェクトのコンストラクタが実行されるように


することはできませんが


代わりに


オブジェクトのコピーコンストラクタというものが実行されるよう設定することができます」



マックス「なにぃ なんだ それは」


ソーラー「


main関数内で


         🍋オブジェクト宣言した場合には🍋


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



main関数内で


   🍅オブジェクト宣言と同時にオブジェクト宣言を初期化したときは🍅


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



初期化というのがポイントだね」


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

👇


#include <iostream>


using namespace std;


class Suuti {


public:


int x;


public:


Suuti();


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




public:


~Suuti();


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


};


Suuti::Suuti() {


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



}


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


Suuti::~Suuti() {


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



}


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





int main() {


Suuti a;


a.x = 1;


Suuti b = a;


return 0;

}


ビルド実行結果



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

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

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


ソーラー「


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


           🍅Suuti a;🍅


が実行されると


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


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



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


a.x = 1;


を実行して


オブジェクトaのメンバ変数


a.xに


数値データを代入して



         💖bのクラスSuuti型のオブジェクト宣言と同時にクラスSuuti型のオブジェクトbを初期化💖する


Suuti b = a;


を実行した場合は


クラスSuuti型のオブジェクトbのコンストラクタは実行されないので


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



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


でも


プログラムの実行の終了により


オブジェクトa

オブジェクトb


がメモリから消去されるときは


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

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


ともに実行されるので


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


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

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


が表示されているね」



マックス「オブジェクト宣言とオブジェクト宣言、初期化では


オブジェクトのコンストラクタが実行される、実行されないの違いがあるってわけか


そんな違いがあると🌷はな( ̄ー ̄)ニヤリ



ソーラー「


しかし


クラスのメンバ関数として


コピーコンストラクタを設定しておけば


main関数内で


  🍅オブジェクト宣言と同時にオブジェクト宣言が初期化されたとき🍅


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


代わりに


オブジェクトのコピーコンストラクタが実行されるようにすることができます


同様に


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

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

自作関数を実行した場合には



🍅オブジェクト宣言と同時にオブジェクト宣言が初期化されたと見なされるので🍅



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


しかし


クラスのメンバ関数として


コピーコンストラクタを設定しておけば


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

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

自作関数を実行した場合に


🍅オブジェクト宣言と同時にオブジェクト宣言が初期化されたとみなされるので🍅


オブジェクトのコピーコンストラクタが実行されるようにすることができます


マックス「クラスのメンバ関数として


コンストラクタを設定したように


クラスのメンバ関数として


コピーコンストラクタ


を設定するってわけか?


なんか 仕組みは簡単そうだな


コンストラクタとコピーコンストラクタは


仲間っぽいな」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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