「オーバーロード」の編集履歴(バックアップ)一覧はこちら

オーバーロード - (2017/12/06 (水) 15:26:24) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

*オーバーロード **オーバーロード 同じ名前の関数を複数定義し、 引数のとり方により、振る舞いを変えることをオーバーロードといいます。 同じ名前の関数でも、引数の 型 個数 を変えて複数実装を書くことができます。 /*--------------Character.hの中身----------------*/ #pragma once #include <iostream> #include <string> using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 Character(string name, int HP, int STR); // コンストラクタ ~Character(); // デストラクタ // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Damage(int damage); // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Damage(int damage, string attacker); void Draw_Status(); // ステータス表示 //【ゲッター】 string GetName(); int GetSTR(); }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // デストラクタ Character::~Character(){ // 何もしない } // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Character::Damage(int damage){ this->HP -= damage; cout << name << "は" << damage << "のダメージをうけた" << endl; } // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Character::Damage(int damage, string attacker){ this->HP -= damage; cout << attaker << "の攻撃" << endl; cout << name << "は" << damage << "のダメージをうけた" << endl; } // ステータス表示 void Character::Draw_Status(){ cout << "name:" << name << endl; cout << "HP :" << HP << endl; cout << "STR :" << STR << endl; } //【ゲッター】 string GetName(){ return name; } int GetSTR(){ return STR; } /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); // Characterクラスの実体「slime」を作成 Character* slime = new Character("スライム", 3, 1); // 唐沢にダメージ(ダメージ数のみ) karasawa->Damage(5); karasawa->Draw_Status();// ステータス表示 // 唐沢がスライムに攻撃(ダメージ数と攻撃者の名前) slime->Damage(karasawa->GetSTR(), karasawa->GetName()); slime->Draw_Status();// ステータス表示 delete karasawa; //「karasawa」を削除 delete slime; //「slime」を削除 return 0; } コンストラクタをオーバーロードすることもできます。 /*--------------Character.hの中身----------------*/ #pragma once #include < iostream > #include <string> using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 Character(string name, int HP, int STR); // コンストラクタ Character(string name); // コンストラクタ(オーバーロード:名前だけ得る) ~Character(); // デストラクタ // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Damage(int damage); // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Damage(int damage, string attacker); void Draw_Status(); // ステータス表示 //【ゲッター】 string GetName(); int GetSTR(); }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // コンストラクタ(名前だけ得る) Character::Character(string name){ this->name = name; this->HP = 1; this->STR = 1; } // デストラクタ Character::~Character(){ // 何もしない } /* 以下略 */ /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); // Characterクラスの実体「slime」を作成(名前だけを指定) Character* slime = new Character("スライム"); // ステータス表示 karasawa->Draw_Status(); slime->Draw_Status(); delete karasawa; //「karasawa」を削除 delete slime; //「slime」を削除 return 0; } **デフォルト引数 デフォルト引数とは、引数に初期値を設定して、 関数呼び出し時に引数を省略できるようにするものです。 例 /*--------------Character.hの中身----------------*/ #pragma once #include < iostream > #include <string> using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 // コンストラクタ(デフォルト引数あり) Character(string name, int HP = 1, int STR = 1); ~Character(); // デストラクタ // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Damage(int damage); // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Damage(int damage, string attacker); void Draw_Status(); // ステータス表示 //【ゲッター】 string GetName(); int GetSTR(); }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ(cppの方にはデフォルト引数の値を書かない) Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // デストラクタ Character::~Character(){ // 何もしない } /* 以下略 */ /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); // Characterクラスの実体「slime」を作成(HPとSTRを省略) Character* slime = new Character("スライム"); // Character* slime = new Character("スライム", 1, 1); と書いたのと同じ結果になる // Character* slime = new Character("スライム", 1); とSTRだけ省略することもできる // ステータス表示 karasawa->Draw_Status(); slime->Draw_Status(); delete karasawa; //「karasawa」を削除 delete slime; //「slime」を削除 return 0; } ***使用上の注意 デフォルト引数にしていできるのは末端の引数です。 Character(string name, int HP = 1, int STR = 1); // OK Character(string name, int HP = 1, int STR); // だめ **問題  第2問 コンソール上に 指定した文字 で 指定した大木さ の四角形を描くプログラムを作成せよ。 関数にはオーバーロードを用いて以下のような形式で指定できるようにすること。 //*で正方形を描く drawRect(int side); //*で長方形を描く drawRect(int width, int height); //指定した文字で正方形を描く drawRect(int side, char c); //指定した文字で長方形を描く drawRect(int width, int height, char c); このクラスはメンバ変数を持つ必要がない また、関数にstaticをつけると静的関数として オブジェクトを作らなくても、クラス名::関数名 で直接クラスから実行できる。 静的関数だけを持つクラスを「ユーティリティークラス」という。  第3問 問題2のプログラムはデフォルト引数を使えば短く書くことができる。 書き直してみよう。 testcounter 合計 &counter(total) 今日 &counter(today) 昨日 &counter(yesterday)
*オーバーロード **オーバーロード 同じ名前の関数を複数定義し、 引数のとり方により、振る舞いを変えることをオーバーロードといいます。 同じ名前の関数でも、引数の 型 個数 を変えて複数実装を書くことができます。 /*--------------Character.hの中身----------------*/ #pragma once #include <iostream> #include <string> using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 Character(string name, int HP, int STR); // コンストラクタ ~Character(); // デストラクタ // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Damage(int damage); // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Damage(int damage, string attacker); void Draw_Status(); // ステータス表示 //【ゲッター】 string GetName(); int GetSTR(); }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // デストラクタ Character::~Character(){ // 何もしない } // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Character::Damage(int damage){ this->HP -= damage; cout << name << "は" << damage << "のダメージをうけた" << endl; } // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Character::Damage(int damage, string attacker){ this->HP -= damage; cout << attaker << "の攻撃" << endl; cout << name << "は" << damage << "のダメージをうけた" << endl; } // ステータス表示 void Character::Draw_Status(){ cout << "name:" << name << endl; cout << "HP :" << HP << endl; cout << "STR :" << STR << endl; } //【ゲッター】 string Character::GetName(){ return name; } int Character::GetSTR(){ return STR; } /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); // Characterクラスの実体「slime」を作成 Character* slime = new Character("スライム", 3, 1); // 唐沢にダメージ(ダメージ数のみ) karasawa->Damage(5); karasawa->Draw_Status();// ステータス表示 // 唐沢がスライムに攻撃(ダメージ数と攻撃者の名前) slime->Damage(karasawa->GetSTR(), karasawa->GetName()); slime->Draw_Status();// ステータス表示 delete karasawa; //「karasawa」を削除 delete slime; //「slime」を削除 return 0; } コンストラクタをオーバーロードすることもできます。 /*--------------Character.hの中身----------------*/ #pragma once #include < iostream > #include <string> using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 Character(string name, int HP, int STR); // コンストラクタ Character(string name); // コンストラクタ(オーバーロード:名前だけ得る) ~Character(); // デストラクタ // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Damage(int damage); // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Damage(int damage, string attacker); void Draw_Status(); // ステータス表示 //【ゲッター】 string GetName(); int GetSTR(); }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // コンストラクタ(名前だけ得る) Character::Character(string name){ this->name = name; this->HP = 1; this->STR = 1; } // デストラクタ Character::~Character(){ // 何もしない } /* 以下略 */ /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); // Characterクラスの実体「slime」を作成(名前だけを指定) Character* slime = new Character("スライム"); // ステータス表示 karasawa->Draw_Status(); slime->Draw_Status(); delete karasawa; //「karasawa」を削除 delete slime; //「slime」を削除 return 0; } **デフォルト引数 デフォルト引数とは、引数に初期値を設定して、 関数呼び出し時に引数を省略できるようにするものです。 例 /*--------------Character.hの中身----------------*/ #pragma once #include < iostream > #include <string> using namespace std; // キャラクタークラス class Character{ private: //【メンバ変数】 string name; // 名前 int HP; // 体力 int STR; // 攻撃力 public: //【メンバ関数】 // コンストラクタ(デフォルト引数あり) Character(string name, int HP = 1, int STR = 1); ~Character(); // デストラクタ // ダメージ関数(オーバーロード:ダメージ数のみ得る) void Damage(int damage); // ダメージ関数(オーバーロード:誰が攻撃したかも得る) void Damage(int damage, string attacker); void Draw_Status(); // ステータス表示 //【ゲッター】 string GetName(); int GetSTR(); }; /*--------------Character.cppの中身----------------*/ #include "Character.h" // コンストラクタ(cppの方にはデフォルト引数の値を書かない) Character::Character(string name, int HP, int STR){ this->name = name; this->HP = HP; this->STR = STR; } // デストラクタ Character::~Character(){ // 何もしない } /* 以下略 */ /*--------------main.cppの中身----------------*/ #include "Character.h" int main(){ // Characterクラスの実体「karasawa」を作成 Character* karasawa = new Character("唐沢", 10, 2); // Characterクラスの実体「slime」を作成(HPとSTRを省略) Character* slime = new Character("スライム"); // Character* slime = new Character("スライム", 1, 1); と書いたのと同じ結果になる // Character* slime = new Character("スライム", 1); とSTRだけ省略することもできる // ステータス表示 karasawa->Draw_Status(); slime->Draw_Status(); delete karasawa; //「karasawa」を削除 delete slime; //「slime」を削除 return 0; } ***使用上の注意 デフォルト引数にしていできるのは末端の引数です。 Character(string name, int HP = 1, int STR = 1); // OK Character(string name, int HP = 1, int STR); // だめ **問題  第2問 コンソール上に 指定した文字 で 指定した大木さ の四角形を描くプログラムを作成せよ。 関数にはオーバーロードを用いて以下のような形式で指定できるようにすること。 //*で正方形を描く drawRect(int side); //*で長方形を描く drawRect(int width, int height); //指定した文字で正方形を描く drawRect(int side, char c); //指定した文字で長方形を描く drawRect(int width, int height, char c); このクラスはメンバ変数を持つ必要がない また、関数にstaticをつけると静的関数として オブジェクトを作らなくても、クラス名::関数名 で直接クラスから実行できる。 静的関数だけを持つクラスを「ユーティリティークラス」という。  第3問 問題2のプログラムはデフォルト引数を使えば短く書くことができる。 書き直してみよう。 testcounter 合計 &counter(total) 今日 &counter(today) 昨日 &counter(yesterday)

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー