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