クラスとオブジェクト
とりあえず動くC++風『Hello World!』
#include <iostream>
/*******************************/
/* HelloWindows クラスの宣言
/*******************************/
class HelloWindows {
public:
void run();
};
/*******************************/
/* main
/*******************************/
void main() {
HelloWindows* obj = new HelloWindows();
obj->run();
delete obj;
}
/*******************************/
/* HelloWindows クラスの実装
/*******************************/
void HelloWindows::run() {
std::cout << "Hello Windows!" << std::endl;
}
クラスの宣言とか定義はこういう感じですか。クラスのインスタンスを生成してオブジェクトを作るわけですがこういう感じですね。
ここでポイントは delete ですね。C++ にはガベージコレクションがないので、自分で delete 演算子を使ってデストラクタを呼び出さないといけないようです。
何でもないクラスのインスタンスがとんでもないくらいメモリを食うか分からないので、使い終わったらメモリを開放してやる癖をつけといた方が良さそうですね。特に Java 経験者は要注意です。
※サンプルコードは全部貼り付けてるとこれから大変なので、必要なとこだけにするかもしれません。
※あと、インデントはとりあえず8にしてます。私はあんまりインデントするコードを書かないんで、別に16とか32でも良いんですけどね。
#コード見てて思ったんですが、delete ってあんまり美しくないですね。ガベージコレクション考えた人すごいわ。
多態性(ポリモルフィズム)
HelloWindows を継承(インヘリタンス)した HelloWindows2 を作ってみました。
#include <iostream>
/*******************************/
/* HelloWindows クラスの宣言
/*******************************/
class HelloWindows {
public:
void run(); // 普通に宣言
virtual void run2(); // virtual として宣言
};
/*******************************/
/* HelloWindows2 クラスの宣言
/*******************************/
class HelloWindows2 : public HelloWindows {
public:
void run();
void run2();
};
/*******************************/
/* main
/*******************************/
void main() {
// 型は HelloWindows だが中身は HelloWindows2
HelloWindows* obj = new HelloWindows2();
obj->run();
obj->run2();
delete obj;
}
/*******************************/
/* HelloWindows クラスの実装
/*******************************/
void HelloWindows::run() {
std::cout << "Hello Windows!" << std::endl;
}
void HelloWindows::run2() {
std::cout << "Hello Windows!!" << std::endl;
}
/*******************************/
/* HelloWindows2 クラスの実装
/*******************************/
void HelloWindows2::run() {
std::cout << "Hello Windows2!" << std::endl;
}
void HelloWindows2::run2() {
std::cout << "Hello Windows2!!" << std::endl;
}
以下は実行した結果なんですが、、、
Hello Windows!
Hello Windows2!!
続行するには何かキーを押してください . . .
何でスーパークラスの run() 呼ばれるの?おかしいだろ!
スーパークラスを実装する時点で将来自分は継承されるかもしれない。そしてこのメソッドはオーバーライドされるかもしれない。って知ってないと実装出来ないってこと?俺たちに預言者になれと?w
#心が折れそうだ、、、
インターフェースには特別な書き方はないようです。宣言時にメソッドの後ろに「=0」を書くだけだそうです。
ちょっと気になったのは、C++の文法で参考にさせて頂いただいてるサイトに「インタフェースクラスには仮想デストラクタを宣言しておくべきです。」という記述があったのですが、そこには理由がはっっきり書かれていなかったことです。今の時点ではこの記述は見なかったことにしましょう。
#言語の文法やある言語固有の決まりごとのようなものは実はあまり大したことじゃないんです。というか私は正直でどうでも良いと思ってます。そんなことよりももっと大事なことがあるんです。将来このサイトを見てくださる方がいらっしゃるかもしれないので、その方の為にこっちは一旦保留して大事なことの話をちょっとしようと思います。
最終更新:2011年12月07日 09:56