自作関数の引数にクラス*型のポインタ変数宣言を設定し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です


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






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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