自作関数の引数にオブジェクト宣言が設定されている場合も自作関数の引数にオブジェクトが代入された自作関数が実行されるときオブジェクトのコピーコンストラクタが実行されます

つづき


実は


コピーコンストラクタがクラス宣言内で設定されていて




自作関数の引数にそのクラス型のオブジェクト宣言が設定されている場合にも


自作関数の引数にオブジェクトが代入された自作関数が実行されるとき


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


そのことを示す次のプログラムをご覧ください


#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


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


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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