🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
そもそも引数にオブジェクト宣言が設定された自作関数に main関数内で作製されたオブジェクトを代入して 自作関数を実行した場合 オブジェクトのコンストラクタを実行されるようにすることはできません
オブジェクト宣言を実行した場合はオブジェクトのコンストラクタが実行されますがオブジェクト宣言、初期化を実行した場合はオブジェクトのコンストラクタは実行されません
そもそも引数にオブジェクト宣言が設定された自作関数に 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関数内で作製されたオブジェクトを代入して
自作関数を実行した場合に
🍅オブジェクト宣言と同時にオブジェクト宣言が初期化されたとみなされるので🍅
オブジェクトのコピーコンストラクタが実行されるようにすることができます
マックス「クラスのメンバ関数として
コンストラクタを設定したように
クラスのメンバ関数として
コピーコンストラクタ
を設定するってわけか?
なんか 仕組みは簡単そうだな
コンストラクタとコピーコンストラクタは
仲間っぽいな」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます