🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
コピーコンストラクタがクラスSuutiに設定されていてもSuuti a = b;の実行時、オブジェクトaがオブジェクトbにより初期化されるようにしてみた~い
コピーコンストラクタがクラスSuutiに設定されていてもSuuti a = b;の実行時、オブジェクトaがオブジェクトbにより初期化されるようにしてみた~い
🌞 🌞 🌞 🌞 🌞 🌞 🌞
そうなんです
クラスSuuti宣言のクラス宣言内に
コピーコンストラクタのメンバ関数宣言が設定されていると
aのクラスSuuti型のオブジェクト宣言、bによる初期化
Suuti a = b;
を実行しても
クラスSuuti型のオブジェクトaはクラスSuuti型のオブジェクトbによって
初期化されなくなります
どう? 驚いた~
そのことを示すプログラムはこちらです
🌞 🌞 🌞 🌞 🌞 🌞 🌞
👇
#include <iostream>
using namespace std;
class Suuti{
public:
int x;
public:
Suuti();
//👆🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞
public:
Suuti(Suuti& c);
//👆🌞🌞🌞コピーコンストラクタのメンバ関数宣言を行っています🌞🌞🌞
};
Suuti::Suuti() {
cout << "オブジェクトのコンストラクタが実行されました" << "\n";
}
//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞
int main() {
Suuti b;
b.x = 1;
Suuti a = b;
cout<<a.x<<"\n";
return 0;
}
ビルド実行結果
オブジェクトのコンストラクタが実行されました
オブジェクトのコピーコンストラクタが実行されました
1
-858993460
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「う、うぅむ
Suuti b;
b.x = 1;
Suuti a = b;
の実行により
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行される
つまり
コピーコンストラクタの定義
にxが記述されていれば
xの部分にa.xが代入されたものが実行される
だが
クラスSuutiのコピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
には
xが記述されていないので
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
が実行されることになるわけだ
このとき
クラスSuutiのコピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
の
Suuti& c
の参照変数cに
クラスSuuti型のオブジェクトbが代入された状態で
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
が実行されるんだが
参照変数cは
オブジェクトbそのものになり
c.xはb.xそのものをあらわすことになるので
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << b.x<<"\n";
が実行されることになる
このとき
クラスSuuti型のオブジェクトbのメンバ変数b.xには
数値データ1が格納されているので
ビルド実行結果に
オブジェクトのコピーコンストラクタが実行されました
1
が表示されることになるわけだ
ただ・・・
クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言
Suuti(Suuti& c);
が設定されたため
Suuti a = b;
を実行したとき
Suuti a
ではなく
Suuti& cにオブジェクトbが代入されたため
クラスSuuti型のオブジェクトaに
クラスSuuti型のオブジェクトbが代入されることはなくなった
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xは
クラスSuuti型のオブジェクトbのメンバ変数b.xの持っている数値データ1によって初期化されることはなくなった
ので
a.xが初期化されないときにもとからa.xに格納されている数値データ
-858993460
が
cout<<a.x<<"\n";
により
コマンドプロンプト画面に表示されたわけだ
う~ん?
💖aのクラスSuuti型のオブジェクト宣言、初期化💖
Suuti a = b;
を実行したとき
💖クラスSuuti型のオブジェクトaのコンストラクタは実行されない💖
ので
クラスSuutiのクラス宣言内にコピーコンストラクタを設定したんだろう
だが
クラスSuutiのクラス宣言内にコピーコンストラクタを設定して
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されるようになっても
クラスSuuti型のオブジェクトaをクラスSuuti型のオブジェクトbで初期化できない
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xを
クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している値1で初期化できなくなったんでは
Suuti a = b;
を実行する意味がなくなるんじゃないか?
もともと
Suuti a = b;
は
クラスSuuti型のオブジェクトaをクラスSuuti型のオブジェクトbで初期化する
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xを
クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している値1で初期化するために
実行しているんだろう?」
int(イント)「ほんとだ おもしろいね(^_-)-☆」
ソーラー「ね 面白いでしょ
なかなか凝った設定になってるよね」
マックス「ちょっと、ちょっと
繰り返すと
aのクラスSuuti型のオブジェクト宣言、bによる初期化
Suuti a = b;
を行った場合は
クラスSuuti型のオブジェクトaのコンストラクタは実行されない
そして
クラスSuuti宣言のクラス宣言内に
コピーコンストラクタのメンバ関数宣言が設定されていると
aのクラスSuuti型のオブジェクト宣言、bによる初期化
Suuti a = b;
を実行した場合
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されても
クラスSuuti型のオブジェクトaはオブジェクトbによって
初期化されなくなるんだろう
じゃあ
クラスSuuti宣言のクラス宣言内に
コピーコンストラクタのメンバ関数宣言が設定されているとき
aのクラスSuuti型のオブジェクト宣言、初期化
Suuti a = b;
を実行した場合
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されると同時に
クラスSuuti型のオブジェクトa
が
クラスSuuti型のオブジェクトbによって
初期化されるようにするためには
ど~したらいいんだにゃ~ん😸?
コピーコンストラクタのメンバ関数宣言を取り除いてしまうと
aのクラスSuuti型のオブジェクト宣言、初期化
Suuti a = b;
はできなくなってしまうしなぁ」
ぶーにゃん「にゃんにゃ~ん」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
うふふ さあ どうしよっか うふふ
🌞 🌞 🌞 🌞 🌞 🌞 🌞
マックス「そうだなあ
a.xにb.xの格納している数値データ1が格納できるようにすればいいんだろう?」
ソーラー「さあ どうなるかな?
簡単かな?😊」
マックス「
クラスSuutiのクラス宣言内に
コピーコンストラクタのメンバ関数宣言が設定されているとき
aのオブジェクト宣言かつクラスSuuti型のオブジェクトbによる初期化
Suuti a = b;
を実行した場合
クラスSuuti型のオブジェクトaのコピーコンストラクタは実行されるんだが・・・
だが
クラスSuuti型のオブジェクトaにクラスSuuti型のオブジェクトbは代入されず
クラスSuuti型のオブジェクトaのメンバ変数a.x
に
クラスSuuti型のオブジェクトbのメンバ変数b.x
が代入されることはない
だったら
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されることは確実なら
クラスSuuti型のオブジェクトaのコピーコンストラクタの実行において
クラスSuuti型のオブジェクトaのメンバ変数a.xに
クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している数値データ1
が格納できるようにすればいいということになる?・・・か?」
てんC「マックスさん、その調子~」
マックス「おお ま、まかせろ
あ、ああ、う、うう
じゃあ
今のクラスSuutiのコピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
}
を
そうだな
こうしたらいいんじゃないか?
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
x=c.x;//👈ここです
}
このようにコピーコンストラクタの定義が変更されたプログラムを
実行してみると・・・
そのプログラムはつぎのようになるか
👇
#include <iostream>
using namespace std;
class Suuti {
public:
int x;
public:
Suuti();
//👆🌞🌞🌞コンストラクタのメンバ関数宣言を行っています🌞🌞🌞
public:
Suuti(Suuti& c);
//👆🌞🌞🌞コピーコンストラクタのメンバ関数宣言を行っています🌞🌞🌞
};
Suuti::Suuti() {
cout << "オブジェクトのコンストラクタが実行されました" << "\n";
}
//👆🌞🌞🌞コンストラクタの定義を行っています🌞🌞🌞
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
x = c.x;//👈ここです
}
//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞
int main() {
Suuti b;
b.x = 1;
Suuti a = b;
cout << a.x << "\n";
return 0;
}
ビルド実行結果
オブジェクトのコンストラクタが実行されました
オブジェクトのコピーコンストラクタが実行されました
1
1
マックス「あっ なんかうまくいったった
いや
ふっ
予想通りうまくいったな
cout << a.x << "\n";
のビルド実行結果が
1
となっている(^^)/
今のこのプログラムでは
Suuti b;
b.x = 1;
により
クラスSuuti型のオブジェクトbが生成され
クラスSuuti型のオブジェクトbのメンバ変数b.xに
数値データ1が代入されている
aのオブジェクト宣言かつクラスSuuti型のオブジェクトbによる初期化
Suuti a = b;
が実行されると
クラスSuuti型のオブジェクトaのコピーコンストラクタが実行される
つまり
コピーコンストラクタの定義内に
xが記述されていれば
xの部分にa.xが代入されたものが実行される
今のプログラムでは
クラスSuutiのコピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
x=c.x;
}
には
xが記述されているので
💖 xにa.xが代入された 💖
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
a.x=c.x;
が実行されることになるわけだ
ここがミソだな
このとき
Suuti& c
の参照変数cに
クラスSuuti型のオブジェクトbが代入された状態で
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x<<"\n";
a.x=c.x;
が実行されるんだが
参照変数cは
クラスSuuti型のオブジェクトbそのものになり
c.xはb.xそのものをあらわすことになるので
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << b.x<<"\n";
a.x=b.x;
が実行されることになる
このとき
クラスSuuti型のオブジェクトbのメンバ変数b.xには数値データ1が格納されているので
a.x=b.x;
が実行されると
クラスSuuti型のオブジェクトaのメンバ変数a.xには数値データ1が格納されることになるわけだ
となると
cout<<a.x<<"\n";
の
ビルド実行結果は
1
となるわけだ
つまり
クラスSuutiのメンバ関数であるコピーコンストラクタを
うまく定義することにより
Suuti b;
b.x = 1;
Suuti a = b;
を実行したとき
💖クラスSuuti型のオブジェクトaのコピーコンストラクタが実行されたと同時に💖
クラスSuuti型のオブジェクトaが
クラスSuuti型のオブジェクトbで初期化
つまり
クラスSuuti型のオブジェクトaのメンバ変数a.xが
クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している数値データ1によって
初期化されたわけだ
わっははは~~~どうだぁ。
いや~うまくいったぜい」
🌞 🌞 🌞 🌞 🌞 🌞 🌞
いい解答・・・
🌞 🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「そう
コピーコンストラクタをうまく定義して
コピーコンストラクタを
クラスSuutiのメンバ関数に設定することにより
aのオブジェクト宣言かつクラスSuuti型のオブジェクトbによる初期化
Suuti a = b;
の実行時
オブジェクトaのコピーコンストラクタが
実行されると同時に
クラスSuuti型のオブジェクトa
が
クラスSuuti型のオブジェクトbにより初期化されるようになりましたね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます