🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
自作関数の引数にオブジェクト宣言が設定されている場合も自作関数の引数にオブジェクトが代入された自作関数が実行されるときオブジェクトのコピーコンストラクタが実行されます
自作関数の引数にオブジェクト宣言が設定されている場合も自作関数の引数にオブジェクトが代入された自作関数が実行されるときオブジェクトのコピーコンストラクタが実行されます
つづき
実は
コピーコンストラクタがクラス宣言内で設定されていて
自作関数の引数にそのクラス型のオブジェクト宣言が設定されている場合にも
自作関数の引数にオブジェクトが代入された自作関数が実行されるとき
オブジェクトのコピーコンストラクタが実行されます
そのことを示す次のプログラムをご覧ください
#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";
}
//👆🌞🌞🌞コピーコンストラクタの定義を行っています🌞🌞🌞
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
自作関数が実行されました
78621911
マックス「おっコピーコンストラクタが実行されているな」
ソーラー「そうですね
このプログラムでは
まず
Suuti b;
の実行により
クラスSuuti型のオブジェクトbが生成されています
このとき
クラスSuuti型のオブジェクトbのコンストラクタが
実行されます
ですので
ビルド実行結果に
オブジェクトのコンストラクタが実行されました
が表示されていますね
次に
b.x=1;
により
クラスSuuti型のオブジェクトbのメンバ変数
b.x
に
1が代入されています
そして
お次はいよいよ
自作関数
newmadefunction(b);
の実行だね
newmadefunction(b);
が実行されると
自作関数の定義
👇
void newmadefunction(Suuti a) {
cout << "自作関数が実行されました" << "\n";
cout << a.x << "\n";
}
の
Suuti aにオブジェクトbが代入されるのではなく
コピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
}
の
cのクラスSuuti&型の参照変数宣言Suuti& cに
クラスSuuti型のオブジェクトbが代入されます」
マックス「ぬああにいぃぃんぃぃぃぃぃ
まさか
自作関数
newmadefunction(b);
の実行では
Suuti aに
クラスSuuti型のオブジェクトbが代入されるように
そのときですら
コピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
}
の
cのクラスSuuti&型の参照変数宣言Suuti& cに
クラスSuuti型のオブジェクトbが代入されるのか!??????」
ソーラー「そうなんです
cのクラスSuuti&型の参照変数宣言Suuti& cに
クラスSuuti型のオブジェクトbが代入されるんです
このことは
cのオブジェクト宣言と同時にオブジェクトcが
オブジェクトbによって初期化されているとことに相当しています
ですので
コピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
}
の
cのクラスSuuti&型の参照変数宣言Suuti& cに
クラスSuuti型のオブジェクトbが代入されたものが実行されることになります
」
マックス「自作関数の引数のSuuti aにオブジェクトbが代入されるようにみえる
自作関数
newmadefunction(b);
が実行される場合でもコピーコンストラクタが実行されるのか・・・
なんか
コピーコンストラクタが実行されまくることにならないか?」
ソーラー「
ですので
cのクラスSuuti&型の参照変数宣言
Suuti& cに
クラスSuuti型のオブジェクトbが代入された状態で
コピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
}
内の
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
が実行されることになります
このとき
c.xはb.xそのものをあらわすことになるので
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << b.x << "\n";
が
実行されることになります
クラスSuuti型のオブジェクトbのメンバ変数b.xには数値データ1が代入されているので
ビルド実行結果に
オブジェクトのコピーコンストラクタが実行されました
1
が表示されることになります
さて
自作関数
newmadefunction(b);
の実行では
Suuti aにオブジェクトbが代入されるのではなく
コピーコンストラクタの定義
👇
Suuti::Suuti(Suuti& c) {
cout << "オブジェクトのコピーコンストラクタが実行されました" << "\n";
cout << c.x << "\n";
}
の
😊cのクラスSuuti&型の参照変数宣言Suuti& cに😊
😊クラスSuuti型のオブジェクトbが代入されたので😊
newmadefunction(b);
が実行されるとき
もう
自作関数の定義
👇
void newmadefunction(Suuti a) {
cout << "自作関数が実行されました" << "\n";
cout << a.x << "\n";
}
の
Suuti a
に
オブジェクトbが代入されることはありません
ですので
Suuti a
に
オブジェクトbが代入されることはないまま
自作関数の定義
👇
void newmadefunction(Suutidisplay a) {
cout << "自作関数が実行されました" << "\n";
cout << a.x << "\n";
}
内の
cout << "自作関数が実行されました" << "\n";
cout << a.x << "\n";
が実行されることになります
このとき
クラスSuuti型のオブジェクトaのメンバ変数a.xには何も数値が代入されていない状態となっています
ですので
cout << "自作関数が実行されました" << "\n";
cout << a.x << "\n";
が実行されると
コマンドプロンプト画面に
自作関数が実行されました
78621911
のように
クラスSuuti型のオブジェクトaのメンバ変数 a.xに数値が代入されないとき
クラスSuuti型のオブジェクトaのメンバ変数a.xにもとから格納されている数値
78621911
が表示されることになります」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます