C++スコーラ

クラス

最終更新:

cschola

- view
管理者のみ編集可

オブジェクト指向

C++はオブジェクト指向型プログラミング言語です。
従来の手続き型言語に比べ、プログラムの柔軟性やプログラミングの効率、データの安全性が高くなっています。
オブジェクトとは物や概念を表し。
性質(状態)と動作(操作)を持ちます。
例)
車の性質: 馬力 重量 乗車人数
車の動作: 加速する 減速する エンジンをかける エンジンを止める

クラス

クラスは構造体の機能を拡張したものです。
クラスの中に定義された変数をメンバ変数と言います。
#include < iostream >
#include < string >

// キャラクタークラス
class Character{
public: // アクセス修飾子

	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

	//【メンバ関数】
	Character();	// コンストラクタ
	~Character();	// デストラクタ

};
アクセス修飾子については、後で説明します。
とりあえず今は public: と書いておきましょう。

コンストラクタとデストラクタも後で説明します。

メンバ関数

構造体ではメンバとして変数しか扱えませんが、クラスでは関数も扱うことができます。(メンバ関数)
ヘッダーファイルではクラスにメンバ関数を定義します。
ソースファイルではヘッダーファイルをインクルードし、メンバ関数の実装を記述します。
/*--------------Character.hの中身----------------*/
#include < iostream >
#include < string >

// キャラクタークラス
class Character{
public: // アクセス修飾子

	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

	//【メンバ関数】
	Character();	// コンストラクタ
	~Character();	// デストラクタ

	void Damage(int damage);   // ダメージ関数
};

/*--------------Character.cppの中身----------------*/
#include "Character.h"

// ダメージ関数
void Character::Damage(int damage){
	this->HP -= damage;
}

メンバ関数の実装を記述するにはスコープ解決演算子(::)を用いてクラスを指定します。

this->

上の例では HP の前に this-> が付いていますが、これを付けるとそのクラスが保有しているメンバ変数(もしくは関数)を指定できます。
this-> は省略することもできます。
/*--------------Character.cppの中身----------------*/
#include "Character.h"

// ダメージ関数
void Character::Damage(int damage){
	HP -= damage;
}

じゃあ何のために存在すんだよ、と思うかもしれませんが
以下のような場合に使用します。

/*--------------Character.cppの中身----------------*/
#include "Character.h"

// ダメージ関数
void Character::Damage(int HP){
	// Characterのメンバ変数の HP から引数の HP を引く
	this->HP -= HP;

	// 引数の HP から引数の HPを引く
	// HP -= HP;	←これじゃダメ
}
this-> を付けずに HP とだけ書くと、引数の HP が参照されてしまいます。
このようにメンバ変数名と引数名が同じになってしまった場合に必要となります。

でもはっきり言って引数名を被らせなきゃいらない子です。

コンストラクタ

クラスにはオブジェクトを生成するための初期化行うコンストラクタというものがあります。
コンストラクタはクラスと同じ名前の関数で、
オブジェクトを生成するときに必ず実行されます。
そのため、コンストラクタには初期化処理を記述します。

コンストラクタの定義では戻り値はありません。
引数は必要に応じて記述できます。
/*--------------Character.hの中身----------------*/
#include < iostream >
#include < string >

// キャラクタークラス
class Character{
public: // アクセス修飾子

	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

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

	void Damage(int damage);   // ダメージ関数
};

/*--------------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;
}

// ダメージ関数
void Character::Damage(int damage){
	this->HP -= damage;
}
コンストラクタが必要ない場合は何も書かなくてもデフォルトコンストラクタとして定義されています。
また、自分でコンストラクタを定義した場合は必ず実装も書かなければいけません。

デストラクタ

デストラクタはオブジェクトを破棄するときに呼び出される関数です。
~クラス名()
のように定義します。
デストラクタでは終了処理を記述します
コンストラクタと同様に戻り値は無く、
さらに、引数をとることできません
/*--------------Character.hの中身----------------*/
#include < iostream >
#include < string >

// キャラクタークラス
class Character{
public: // アクセス修飾子

	//【メンバ変数】
	std::string name;	// 名前
	int HP;		// 体力
	int STR;	// 攻撃力

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

	void Damage(int damage);   // ダメージ関数
};

/*--------------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;
}
終了処理はあまりすることが無いので、デストラクタ内は何も書かない場合も多いです。
するとすればDXライブラリの画像の解放やクラスの解放するくらいです。


testcounter
合計 -
今日 -
昨日 -
目安箱バナー