ここでご注意 メンバ関数の引数にGameCaracter aでなくGameCaracter& aをもちいるわけはaに代入されるオブジェクト本体にアクセスし格納されているデータの値を変更するためです 

メンバ関数の引数にGameCaracter aでなくGameCaracter& aをもちいるわけはaに代入されるオブジェクト本体のメンバ変数の値を変更するためです 

ソーラー「


🐉ドラゴン(Dragon)タイプ🐉のキャラクターの


火を吐いて火を吐かれた側のキャラクターのHPを回復させる


ということを可能にする


クラスGameCharacterのメンバ関数宣言は


void useFireRecovery(GameCharacter& a);

(Fireは火、Recoveryは回復という意味です)


とし


その定義は


void GameCharacter::useFireRecovery(GameCharacter& a){


cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた" << "\n";


cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


としましたね」


マックス「ここだワン🐕



クラスGameCharacterのメンバ関数宣言は


void useFireRecovery(GameCharacter& a);

(Fireは火、Recoveryは回復という意味です)


とし


その定義は


void GameCharacter::useFireRecovery(GameCharacter& a){


cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた" << "\n";


cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


となっているが


なぜ引数に


(aのGameCharacter&型の参照変数宣言)


GameCharacter& a


がもちいられているんだ??


GameCharacter a


ではだめなのか?」


solarplexuss 「ほんと、そうだ」


ソーラー「そうですね



それでは


           💖GameCharacter& a💖


と記述されたときと


           🌰GameCharacter a🌰


の違いを


実際にみていこうよ


まずは


           💖GameCharacter& a💖



と記述された場合です

👇

#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter& a);



};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


void GameCharacter::useFireRecovery(GameCharacter& a) {

cout << name << "は灼熱のフレアを" << a.name << "に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!" << "\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}



int main() {


GameCharacter Lyliane;


Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


GameCharacter Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

ポッキーは灼熱のフレアをリリアーネに吐いた!

リリアーネは灼熱のフレアを受け燃え上がった!

リリアーネの体力は10回復した

リリアーネ

HP 20//🌞ここに注目 HPが回復してます!

MP 8

ポッキー

HP 15

MP 5


マックス「いいな これ! HP回復しているな」


ソーラー「次は


          🌰GameCharacter a🌰


と記述された場合です


👇



#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter a);



};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


void GameCharacter::useFireRecovery(GameCharacter a){

cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}



int main() {


GameCharacter Lyliane;

Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


GameCharacter Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}



プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

ポッキーは灼熱のフレアをリリアーネに吐いた!

リリアーネは灼熱のフレアを受け燃え上がった!

リリアーネの体力は10回復した

リリアーネ

HP 10//🌞ここに注目 HPが回復していません!

MP 8

ポッキー

HP 15

MP 5



マックス「いいなあ、って




                HPが回復していない!



                                    Why(なぜぇ)?」




ソーラー「そうなんです


Pokky.useFireRecovery(Lyliane);


が実行されたとき


クラスGameCharacter型のオブジェクトLylianeが



                GameCharacter a


に代入されることになりますが



このとき


              恒例の



             💖値渡し💖


が実行されているんです



つまり


Pokky.useFireRecovery(Lyliane);


が実行されるとき



クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter a)


の定義

👇


void GameCharacter::useFireRecovery(GameCharacter a){


cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";


cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}



GameCharacter a



クラスGameCharacter型のオブジェクトLylianeが


代入されることになりますが



   クラスGameCharacter型のオブジェクトLylianeの持っているデータだけが



わたされることになるんです



クラスGameCharacter型のオブジェクトLylianeそのものが直接渡されているわけではありません



たとえば

            😊main関数内で😊


int a=1;


と変数宣言、初期化された


変数a


            (*´ω`*)main関数の外で(*´ω`*)


f(int x){

x=x+5;

}

と定義された


自作関数f(int x)があるとします


このとき

main関数内で


f(a);


が実行された場合


変数a自体が


xに代入されるのでなく


変数aに格納されている数値データ1だけが渡されるのと全く同じことですね


よって


f(a);


が実行されても


変数aに格納されている数値データが6になることはありません


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



つまり


main関数内でmain関数の外で定義された引数をもつ関数を実行するとき



  🌞main関数内で変数宣言された変数をmain関数の外で定義された関数の引数に代入すると🌞


         その変数の格納しているデータだけが


       main関数の外で定義された関数の引数に代入される


という


              💖値渡し💖


がおこるんです




その関数がクラスのメンバ関数であっても同様です



つ・ま・り😊



Pokky.useFireRecovery(Lyliane);


のように


           🌞main関数内で🌞


          GameCharacter Lyliane;


               と


     🌞オブジェクト宣言されたクラスGameCharacter型のオブジェクトLyliane🌞



          🌞main関数の外で定義された🌞


 🌞クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter a)🌞




          🌞引数GameCharacter aに代入すると🌞



      🌞 クラスGameCharacter型のオブジェクトをLylianeの格納しているデータだけが🌞



          🌞引数のGameCharacter aに代入される🌞


という


              💖値渡し💖


が起こることになります


もう少し詳しく説明すると


Pokky.useFireRecovery(Lyliane);


が実行されるとき


クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter a)


の定義

👇


void GameCharacter::useFireRecovery(GameCharacter a){

cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


name

には

GameCharacter型のオブジェクトPokkyのメンバ変数


Pokky.name自身、そのもの本体(👈ここもポイントです 値渡しではありません)



a.name

a.HP

には

GameCharacter型のオブジェクトLylianeのメンバ変数


Lyliane.name

Lyliane.HP


の格納している



            🍎 💖値,データ💖 🍎



                だけ


が値渡しされることになります


ですから



cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";


cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";



により


a.HP += 10;


すなわち


a.HP =a.HP +10;


が実行されたとしても


クラスGameCharacter型のオブジェクトLylianeのメンバ変数


Lyliane.HP


の格納している値が10増加することはないというわけなんだね😊」



マックス「??


Pokky.useFireRecovery(Lyliane);


が実行されるとき


クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter a)


の定義

👇


void GameCharacter::useFireRecovery(GameCharacter a){

cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


name

には

GameCharacter型のオブジェクトPokkyのメンバ変数


Pokky.name自身、そのもの本体(👈ここもポイントです 値渡しではありません)



代入されるのはなんでだ?」



ソーラー「実は よくみると


Pokky.useFireRecovery(Lyliane);


の実行により


引数に渡されているのは


 main関数内で


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


          GameCharacter Lyliane;


により生成された


クラスGameCharacter型のオブジェクトLylianeだけで


GameCharacter Pokky;


により生成された


クラスGameCharacter型のオブジェクトPokkyはどこにも代入されていないのがわかります


つまり


クラスGameCharacter型のオブジェクトPokkyのメンバ関数


Pokky.useFireRecovery(Lyliane);


が実行される時点で


クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter a)


の定義

👇


void GameCharacter::useFireRecovery(GameCharacter a){

cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


name

には

GameCharacter型のオブジェクトPokkyのメンバ変数


Pokky.name自身、そのもの本体


代入されるようシステムが設計されているというわけです


ですので


もし


クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter a)


の定義が

👇


void GameCharacter::useFireRecovery(GameCharacter a){

cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";

     

a.HP += 10;

HP += 10;

cout << a.name << "の体力は10回復した" << "\n";

cout << name << "の体力は10回復した" << "\n";

}


のように記述されていれば


Pokky.useFireRecovery(Lyliane);


の実行時


HPに代入されるのは


Pokky.HPそのものとなり


           ( ̄▽ ̄;)ポッキーの体力だけ💦💧


が10回復することになります」


その時のプログラムはこちらです

👇

#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter a);



};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}


void GameCharacter::useFireRecovery(GameCharacter a) {

cout << name << "は灼熱のフレアを" << a.name << "に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!" << "\n";


a.HP += 10;

HP += 10;

cout << a.name << "の体力は10回復した" << "\n";

cout << name << "の体力は10回復した" << "\n";

}


int main() {


GameCharacter Lyliane;


Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


GameCharacter Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}



プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

ポッキーは灼熱のフレアをリリアーネに吐いた!

リリアーネは灼熱のフレアを受け燃え上がった!

リリアーネの体力は10回復した

ポッキーの体力は10回復した

リリアーネ

HP 10//🌞ここに注目 リリアーネのHPが回復していません!

MP 8

ポッキー

HP 15//🌞ここに注目 ポッキーのHPが回復しています!

MP 5




ソーラー「そのため


aのGameCharacter&型の参照変数宣言


           💖GameCharacter& a💖



クラスGameCharacterのメンバ関数useFireRecoveryの引数として


クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter& a)


のように設定しておく必要があるというわけですね


           💖GameCharacter& a💖


に設定しておけば


確実に


クラスGameCharacter型のオブジェクトPokkyのメンバ関数


Pokky.useFireRecovery(Lyliane);


が実行されるとき


クラスGameCharacterのメンバ関数useFireRecovery(GameCharacter& a)


の定義

👇


void GameCharacter::useFireRecovery(GameCharacter& a){

cout << name << "は灼熱のフレアを"<<a.name<<"に吐いた!" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!"<<"\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}



aは


オブジェクトLylianeをあらわすことになり


a.HP += 10;


が実行されると


Lyliane.HP+=10;


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


Lyliane.HPに格納されている数値データを10増加させることができます


つまり


リリアーネの体力が10回復するというわけだね(´▽`*)」






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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