コピーコンストラクタについて学ぶ前に オブジェクトの値を渡す値渡し オブジェクトのアドレスを渡す参照渡し 参照変数を使ってオブジェクトそのものを渡す方法について学んでみましょう

自作関数の引数にオブジェクト宣言を設定しmain関数内で作製されたオブジェクトを代入した場合はmain関数内で作製されたオブジェクトから自作関数の引数のオブジェクトへの値渡しが行われます

ソーラー「ところで


自作関数の引数にオブジェクト宣言を設定し

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

main関数内で作製されたオブジェクトから

自作関数の引数のオブジェクトへの



😊値渡し😊



が行われます


ということについて考察してみたいのですが・・・」


マックス「ここで


自作関数の引数にオブジェクト宣言を設定しmain関数内で作製されたオブジェクトを代入した場合はmain関数内で作製されたオブジェクトから自作関数の引数のオブジェクトへの😊値渡し😊が行われます


の考察か?


たしかNOWいまデストラクタの考察をしてなかったか?」


ソーラー「いいんです


例えば


main関数内で変数宣言


int b;


により生成された変数bがあるとします


このint型の変数bに


b=1;


と数値データを代入しておきますね。


次に


void newmadefunction(int a){


cout<<a<<"\n";

a=a+1;

cout<<a<<"\n";


}


と定義された


自作関数newmadefunctionの引数となっている


int aに


main関数内で作製された変数b


が代入された


newmadefunction(b);


が実行されるとします



すると


変数bの格納している数値データ1だけが


変数aに


       『値渡し』


された状態で


cout<<a<<"\n";

a=a+1;

cout<<a<<"\n";


が実行されることになります


変数aに変数bが代入された


cout<<b<<"\n";

b=b+1;

cout<<b<<"\n";


が実行されるのではありません


変数aに変数bのもっている数値データ1が代入された状態で


cout<<a<<"\n";

a=a+1;

cout<<a<<"\n";


が実行されることになります



その時のプログラムは以下のようになります

👇

#include <iostream>


using namespace std;


void newmadefunction(int a){


cout << "変数aに格納されている数値データは" << a << "です" << "\n";


a=a+1;


cout << "変数aに格納されている数値データは" << a << "です" << "\n";


}


int main() {


int b;


b = 1;


cout << "変数bに格納されている数値データは" << b << "です" << "\n";

newmadefunction(b);


cout << "変数bに格納されている数値データは" << b << "です" << "\n";


return 0;

}


プログラムの実行結果


変数bに格納されている数値データは1です

変数aに格納されている数値データは1です

変数aに格納されている数値データは2です

変数bに格納されている数値データは1です


ソーラー「このプログラムでは


まず


int b;


b = 1;


により


int型の変数bに1が代入されています


そして


cout << "変数bに格納されている数値データは" << b << "です" << "\n";


の実行により


変数bに格納されている数値データは1です



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


次に


newmadefunction(b);


の実行により


😊main関数内で作製された変数bに格納されている数値データ1が😊


自作関数newmadefunctionの引数のint aに渡された状態で


cout << "変数aに格納されている数値データは" << a << "です" << "\n";


a=a+1;


cout << "変数aに格納されている数値データは" << a << "です" << "\n";


が実行されることになります


ですので


変数aに格納されている数値データは1です

変数aに格納されている数値データは2です


がコマンドプロンプト画面に表示されることになります


このとき


main関数内で作製された変数bそのものが


自作関数newmadefunctionの引数のint aに渡された状態で


自作関数newmadefunctionが実行されるのではないのですね


つまり


cout << "変数aに格納されている数値データは" << b << "です" << "\n";


b=b+1;


cout << "変数aに格納されている数値データは" << b << "です" << "\n";


が実行されるのでないのですね


もし実行されているなら


変数bに格納される数値データは


2


になりそうなものですが


newmadefunction(b);


の実行の後に実行される命令文


cout << "変数bに格納されている数値は" << b << "です" << "\n";


の実行結果が


変数bに格納されている数値データは1です


となっていることからも


変数bに格納されている数値データは1のまま変化していないことが確認でき


main関数内で作製された変数bそのものが


自作関数newmadefunctionの引数のint aに渡されて


cout << "変数aに格納されている数値データは" << b << "です" << "\n";


b=b+1;


cout << "変数aに格納されている数値データは" << b << "です" << "\n";


が実行されるのでないことがわかります」



マックス「値渡し なつかしいな~」



ソーラー「


同様に


自作関数newmadefunctionの定義

👇

void newmadefunction(Suuti a){


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";

a.x=a.x+1;

cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";

}



引数部分の


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


Suuti a



main関数内で


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


Suuti b;


により生成されたクラスSuuti型のオブジェクトbが


代入された


newmadefunction(b);


が実行される場合は


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


Suuti a



クラスSuuti型のオブジェクトbが代入されるのではなく


クラスSuuti型のオブジェクトaのメンバ変数


a.x



クラスSuuti型のオブジェクトbのメンバ変数


b.x


の格納している


数値データ1


が渡された状態で


自作関数newmadefunctionの定義内の


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";


a.x=a.x+1;


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";


が実行されます



つまり


main関数内で作製された


クラスSuuti型のオブジェクトbのメンバ変数b.xに格納されている数値データ1が


自作関数の引数となっている


クラスSuuti型のオブジェクトaのメンバ変数a.xに渡される



         『値渡し』


が実行されています」


マックス「おお、オブジェクトの値渡しか」


ソーラー「そう


クラスSuuti型のオブジェクトaにクラスSuuti型のオブジェクトbが代入された


cout << "オブジェクトaのメンバ変数a.xに" << b.x << "が代入されました" << "\n";

b.x=b.x+1;

cout << "オブジェクトaのメンバ変数a.xに" << b.x << "が代入されました" << "\n";


が実行されるのではないのですね。


そのことを示すプログラムは次のようになります」

👇

#include <iostream>


using namespace std;


class Suuti{


public:


int x;


};




void newmadefunction(Suuti a) {


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";


a.x = a.x + 1;


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";


}


//👆🌞🌞🌞自作関数newmadefunctionの引数としてaのクラスSuuti型のオブジェクト宣言Suuti a;を行っています🌞🌞🌞


int main() {


Suuti b;


b.x = 1;

cout << "オブジェクトbのメンバ変数b.xに格納されている数値データは" << b.x << "です" << "\n";

newmadefunction(b);


cout <<"オブジェクトbのメンバ変数b.xに格納されている数値データは"<< b.x <<"です"<< "\n";

return 0;

}


プログラムの実行結果


オブジェクトbのメンバ変数b.xに格納されている数値データは1です

オブジェクトaのメンバ変数a.xに1が代入されました

オブジェクトaのメンバ変数a.xに2が代入されました

オブジェクトbのメンバ変数b.xに格納されている数値データは1です


ソーラー「このプログラムでは


まず


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


Suuti b;


により


クラスSuuti型のオブジェクトbが生成され


クラスSuuti型のオブジェクトbのメンバ変数


b.xに


b.x = 1;



数値データ1が代入されています


ですので


その次の命令文


cout << "オブジェクトbのメンバ変数b.xに格納されている数値データは" << b.x << "です" << "\n";


が実行されると


クラスSuuti型のオブジェクトbのメンバ変数b.xに格納されている数値データは1です



コマンドプロンプト画面に表示されることになります


さて  次に


いよいよ


newmadefunction(b);


の実行だね


自作関数


newmadefunction(b);


が実行されると



自作関数newmadefunctionの引数となっている


Suuti a



クラスSuuti型のオブジェクトbが代入された


cout << "オブジェクトaのメンバ変数a.xに" << b.x << "が代入されました" << "\n";

b.x = b.x + 1;


cout << "オブジェクトaのメンバ変数a.xに" << b.x << "が代入されました" << "\n";


が実行されるのではなく


       自作関数newmadefunctionの引数となっている


         クラスSuuti型のオブジェクトaのメンバ変数


             a.xに


        main関数内で作製された


🌞クラスSuuti型のオブジェクトbのメンバ変数b.xの格納している数値データ1🌞


           が代入された状態で


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";


a.x = a.x + 1;


cout << "オブジェクトaのメンバ変数a.xに" << a.x << "が代入されました" << "\n";


が実行されることになるので


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


オブジェクトaのメンバ変数a.xに1が代入されました

オブジェクトaのメンバ変数a.xに2が代入されました


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


Suuti a



クラスSuuti型のオブジェクトbが代入された


cout << "オブジェクトaのメンバ変数a.xに" << b.x << "が代入されました" << "\n";

b.x = b.x + 1;


cout << "オブジェクトaのメンバ変数a.xに" << b.x << "が代入されました" << "\n";


が実行されていれば


クラスSuuti型のオブジェクトbのメンバ変数b.xに代入されている数値データは


2


になりそうなものですが


クラスSuuti型のオブジェクトbのメンバ変数b.xに格納されている数値データは


1のまま変化しないことが


newmadefunction(b);


の実行の後


次に実行される命令文


cout <<"オブジェクトbのメンバ変数b.xに格納されている数値データは"<< b.x <<"です"<< "\n";


の実行結果が


クラスSuuti型のオブジェクトbのメンバ変数b.xに格納されている数値データは1です


となっていることからわかりますね」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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