C言語からC++言語へ その2
前回の記事の続きです。今回はクラスを自分で作れるようにします。
クラスの作成方法
次の例をご覧ください。
プログラム例
#include <iostream>
using namespace std;
/*
********************************
*クラスの定義や、メソッドの定義*
********************************
*/
class MyClass {
public:
//メソッド
void attack(); //攻撃する
void run(); //逃げる
void init_name(string str); //名前を設定する
void print_hp(); //hpを表示する
MyClass(); //コンストラクタ
~MyClass(); //デストラクタ
//属性
int hp; //体力
private:
//メソッド
//属性
string name; //名前
};
void MyClass::attack() {
cout << name << "は攻撃した!" << endl;
}
void MyClass::run() {
cout << name << "は逃げ出した!" << endl;
}
void MyClass::init_name(string str) {
name = str;
}
void MyClass::print_hp() {
cout << name << "のhpは" << hp << endl;
}
//コンストラクタ
MyClass::MyClass() {
cout << "MyClassのオブジェクトが生成されました。" << endl;
hp = 0;
}
//デストラクタ
MyClass::~MyClass() {
cout << "MyClassのオブジェクトが削除されました。" << endl;
}
/*
****************
*main関数の実行*
****************
*/
int main(void) {
MyClass player;
player.init_name("勇者");
player.hp = 100;
player.attack();
player.print_hp();
return 0;
}
publicメンバとprivateメンバ
クラスの定義はclass {};で行います。クラスのメソッドと属性には、アクセス指定子というものを指定できます。この例では、public:とprivate:というアクセス指定子を用いています。public指定子のついた変数や関数はクラスで宣言した関数の外部の関数からもアクセスできますが、privateな変数や関数はそうはいきません。
例えば、このソースコードで、main関数でMyClassのオブジェクトを作成してからnameにアクセスすることはできません。そんなことをすればビルドエラーが発生するはずです。(筆者の環境では、エラー C2248が発生しました。)
そして、ふつう属性は特別な事情がない限りprivateメンバにします。これをカプセル化といい、複数人で行うような大規模なプログラミングには必須のテクニックです。この例ではint型のhpはpublicメンバですが、これは本来避けるべきものです。カプセル化された変数に変更を加えるためには、publicな関数を仲介するのが一般的です。そのような関数をアクセスメソッドといいます。
この例では、stringのオブジェクトであるnameがカプセル化されているので、アクセスメソッドである関数init_nameを使用してnameを設定しています。
コンストラクタとデストラクタ
もう一度クラスの定義を確認しましょう。
class MyClass {
public:
//メソッド
void attack(); //攻撃する
void run(); //逃げる
void init_name(string str); //名前を設定する
void print_hp(); //hpを表示する
MyClass(); //コンストラクタ
~MyClass(); //デストラクタ
//属性
int hp; //体力
private:
//メソッド
//属性
string name; //名前
};
publicメンバに、クラスの名前とまったく同じ名前のメソッド、MyClass();があります。このメソッドをコンストラクタといいます。コンストラクタは特別なメソッドで、返り値の型の宣言が必要ありません。そして、コンストラクタはオブジェクトが生成されたときに1度だけ実行されるので、要素の初期化などに使用されます。
コンストラクタの頭に~(チルダ)をつけたもの(今回の例では~MyClass();)をデストラクタといいます。こちらはコンストラクタとは異なり、オブジェクトが削除されるさいに実行されます。オブジェクトを削除するにはdelete [オブジェクト名]を使用しますが、今回の例ではmain関数が終了してオブジェクトが削除されるのを待っています。
まとめ
クラスにはpublicなメンバとprivateなメンバが存在する。
メソッドはpublicメンバ、要素はprivateメンバになりがち
コンストラクタはオブジェクト生成時に、デストラクタはオブジェクト削除時に実行される。
次回につづくかも