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