オーバーロード - (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)
表示オプション
横に並べて表示:
変化行の前後のみ表示: