🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
メンバ関数の引数にGameCaracter aでなくGameCaracter& aをもちいるわけはaに代入されるオブジェクト本体のメンバ変数の値を変更するためです
ここでご注意 メンバ関数の引数に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回復するというわけだね(´▽`*)」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます