クラス - (2016/03/23 (水) 11:26:45) の最新版との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*オブジェクト指向
C++はオブジェクト指向型プログラミング言語です。
従来の手続き型言語に比べ、プログラムの柔軟性やプログラミングの効率、データの安全性が高くなっています。&br()
オブジェクトとは物や概念を表し。
性質(状態)と動作(操作)を持ちます。&br()
例)
車の性質 馬力 重量 乗車人数
車の動作 加速する 減速する エンジンをかける エンジンを止める
*クラス
クラスは構造体の機能を拡張したもので、データ型として扱います。
構造体ではメンバとして変数しか扱えませんが、クラスでは関数も扱うことができます。
(メンバ変数、メンバ関数)
**クラスの定義
#html2(){{
<pre class="brush: cpp;">
class Person{
public: // アクセス修飾子
// メンバ変数
string name;
int age;
float height;
float weight;
// メンバ関数
void selfIntroduction();
};
</pre>
}}
**メンバ関数の実装
メンバ関数は定義しただけでは使えません。
実際に中身を書いてやる必要があります。
***別々に行う
ヘッダーファイル(.h)とソースファイル(.cpp)に分け
ヘッダーファイルでクラス定義。
ソースファイルで実装を書きます。
ソースファイルではヘッダーファイルをインクルードし、
メンバ関数の実装を記述するにはスコープ解決演算子を用いてクラスを指定します。
#html2(){{
<pre class="brush: cpp;">
void Person::selfIntroduction(){
cout << "私の名前は" << name << "です。" << endl;
}
</pre>
}}
***インライン関数
ファイル分けをせずに定義と同時に実装を記述する方法もあります。
これをインライン関数と呼びます。
基本的には定義と実装は別にすべきです。
#html2(){{
<pre class="brush: cpp;">
class Person{
public:
string name;
int age;
float height;
float weight;
void selfIntroduction(){
cout << "私の名前は" << name << "です。" << endl;
}
};
</pre>
}}
※以下の項目は数回後の講座で詳しく行います。
*コンストラクタ
クラスにはオブジェクトを生成するための初期化行うコンストラクタというものがあります。
コンストラクタはクラスと同じ名前の関数で、
オブジェクトを生成するときに必ず実行されます。
ここに初期化処理を記述します。
コンストラクタの定義では
戻り値はありません。
引数は必要に応じて記述できます。
class Person{
public:
Person(String name);
...
};
Person::Person(String name){
this->name = name;
}
コンストラクタが必要ない場合は何も書かなくてもデフォルトコンストラクタとして定義されています。
また、自分でコンストラクタを定義した場合は必ず実装も書かなければいけません。
*デストラクタ
デストラクタはオブジェクトを破棄するときに呼び出される関数です。
~クラス名()
のように定義します。
コンストラクタと同様に戻り値は無く、
さらに、引数をとることできません。
class Person{
public:
Person();
~Person();
...
};
Person::Person(){
}
Person::~Person(){
}
クラス内に別のオブジェクトのポインタがあり
コンストラクタでnewし、
デストラクタでdeleteする
というような使い方をする。
#include(highlight)
**オブジェクト指向
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;
}
メンバ関数の実装を記述するにはスコープ解決演算子(&bold(){::})を用いてクラスを指定します。
**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 が参照されてしまいます。
このようにメンバ変数名と引数名が同じになってしまった場合に必要となります。
でもはっきり言って引数名を被らせなきゃいらない子です。
**コンストラクタ
クラスにはオブジェクトを生成するための初期化行うコンストラクタというものがあります。
コンストラクタはクラスと同じ名前の関数で、
オブジェクトを生成するときに必ず実行されます。
そのため、&bold(){コンストラクタには初期化処理を記述します。}
コンストラクタの定義では戻り値はありません。
引数は必要に応じて記述できます。
/*--------------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;
}
コンストラクタが必要ない場合は何も書かなくてもデフォルトコンストラクタとして定義されています。
また、自分でコンストラクタを定義した場合は必ず実装も書かなければいけません。
**デストラクタ
デストラクタはオブジェクトを破棄するときに呼び出される関数です。
~クラス名()
のように定義します。
&bold(){デストラクタでは終了処理を記述します}。
コンストラクタと同様に戻り値は無く、
さらに、&bold(){引数をとることできません}。
/*--------------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ライブラリの画像の解放やクラスの解放するくらいです。
//#include(highlight)
testcounter
合計 &counter(total)
今日 &counter(today)
昨日 &counter(yesterday)
//クラスの説明
//・クラスは構造体の拡張版。
//・データ型として扱う。
//・メンバ変数、メンバ関数を持つ。
//・クラスのメンバはアクセス修飾子でアクセス制限をかけることができる。
//
//メンバ関数
//・ヘッダーに定義、ソースに実装を書く。
//・実装の記述にはスコープ解決演算子を用いる。
//・ファイル分けをしない実装方法もある。(インライン関数)
//
//アクセス修飾子
//・クラスのメンバのアクセス制限を表す。
//・public どこからでもアクセス可能
//・private メンバ内からのみアクセス可能
//・protected メンバ内、および派生クラスからアクセス可能
//
//コンストラクタ
//・オブジェクト生成の際に初期化を行う。(new)
//
//デストラクタ
//・オブジェクト破棄の際に呼び出される。(delete)
//
//オブジェクト
表示オプション
横に並べて表示:
変化行の前後のみ表示: