C++スコーラ

オーバーロード

最終更新:

cschola

- view
管理者のみ編集可

オーバーロード

オーバーロード

同じ名前の関数を複数定義し、
引数のとり方により、振る舞いを変えることをオーバーロードといいます。

同じ名前の関数でも、引数の 型 個数 を変えて複数実装を書くことができます。
/*--------------Character.hの中身----------------*/
#pragma once
#include <iostream>
#include <string>
// キャラクタークラス
class Character{
private:
	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

public:
	//【メンバ関数】
	Character(std::string name, int HP, int STR);	// コンストラクタ
	~Character();	// デストラクタ

	// ダメージ関数(オーバーロード:ダメージ数のみ得る)
	void Damage(int damage);
	// ダメージ関数(オーバーロード:誰が攻撃したかも得る)
	void Damage(int damage, std::string attacker);

	void Draw_Status();		// ステータス表示

	//【ゲッター】
	std::string GetName();
	int GetSTR();
};

/*--------------Character.cppの中身----------------*/
#include "Character.h"
using namespace std;

// コンストラクタ
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 << attacker << "の攻撃" << 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クラスの実体「hero」を作成
	Character* hero = new Character("勇者", 10, 2);
	// Characterクラスの実体「slime」を作成
	Character* slime = new Character("スライム", 3, 1);
 
	// 勇者にダメージ(ダメージ数のみ)
	hero->Damage(5);
	hero->Draw_Status();// ステータス表示

	// 勇者がスライムに攻撃(ダメージ数と攻撃者の名前)
	slime->Damage(hero->GetSTR(), hero->GetName());
	slime->Draw_Status();// ステータス表示

	delete hero;	//「hero」を削除
	delete slime;		//「slime」を削除
	
	return 0;
}

コンストラクタをオーバーロードすることもできます。
/*--------------Character.hの中身----------------*/
#pragma once
#include < iostream >
#include <string>

// キャラクタークラス
class Character{
private:
	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

public:
	//【メンバ関数】
	Character(std::string name, int HP, int STR);	// コンストラクタ
	Character(std::string name);		// コンストラクタ(オーバーロード:名前だけ得る)
	~Character();	// デストラクタ

	// ダメージ関数(オーバーロード:ダメージ数のみ得る)
	void Damage(int damage);
	// ダメージ関数(オーバーロード:誰が攻撃したかも得る)
	void Damage(int damage, std::string attacker);

	void Draw_Status();		// ステータス表示

	//【ゲッター】
	std::string GetName();
	int GetSTR();
};

/*--------------Character.cppの中身----------------*/
#include "Character.h"
using namespace std;

// コンストラクタ
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クラスの実体「hero」を作成
	Character* hero = new Character("勇者", 10, 2);
	// Characterクラスの実体「slime」を作成(名前だけを指定)
	Character* slime = new Character("スライム");
 
	// ステータス表示
	hero->Draw_Status();
	slime->Draw_Status();

	delete hero;	//「hero」を削除
	delete slime;		//「slime」を削除
	
	return 0;
}

デフォルト引数

デフォルト引数とは、引数に初期値を設定して、
関数呼び出し時に引数を省略できるようにするものです。

/*--------------Character.hの中身----------------*/
#pragma once
#include < iostream >
#include <string>

// キャラクタークラス
class Character{
private:
	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

public:
	//【メンバ関数】
	// コンストラクタ(デフォルト引数あり)
	Character(std::string name, int HP = 1, int STR = 1);
	~Character();	// デストラクタ

	// ダメージ関数(オーバーロード:ダメージ数のみ得る)
	void Damage(int damage);
	// ダメージ関数(オーバーロード:誰が攻撃したかも得る)
	void Damage(int damage, string attacker);

	void Draw_Status();		// ステータス表示

	//【ゲッター】
	std::string GetName();
	int GetSTR();
};

/*--------------Character.cppの中身----------------*/
#include "Character.h"
using namespace std;

// コンストラクタ(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クラスの実体「hero」を作成
	Character* hero = new Character("勇者", 10, 2);
	// Characterクラスの実体「slime」を作成(HPとSTRを省略)
	Character* slime = new Character("スライム");
	// Character* slime = new Character("スライム", 1, 1); と書いたのと同じ結果になる
	// Character* slime = new Character("スライム", 1); とSTRだけ省略することもできる
 
	// ステータス表示
	hero->Draw_Status();
	slime->Draw_Status();

	delete hero;	//「hero」を削除
	delete slime;		//「slime」を削除
	
	return 0;
}

使用上の注意

デフォルト引数にしていできるのは末端の引数です。
Character(string name, int HP = 1, int STR = 1); 	// OK
Character(string name, int HP = 1, int STR); 		// だめ

目安箱バナー