* コンストラクタとデストラクタ [#dbfefa73]

初期化しないプログラムは殺せ
#contents

** コンストラクタ [#r0b6292e]
クラスのインスタンスが作られるときに実行される特別なメソッド。~
戻り値はなし(というかオブジェクトが返るのか?)。~
[[オーバーライド>オーバーロードとオーバーライド]]できる。<- これは普通のメソッドと同じだが書く必要あるのか?
[[オーバーロード>オーバーロードとオーバーライド]]できる。<- これは普通のメソッドと同じだが書く必要あるのか?

 // C++
 class Hoge{
   private:
     int i;
   public:
     Hoge( void ){
       i = 42;
     }
 class Hoge {
 private:
   int i;
 public:
   Hoge( void ) : i(42) // C++でのメンバー初期化構文
   {
   }
 };

 // Java
 public class Hoge {
   private int i;
   public Hoge(void) {
     this.i = 42;
   }
 }

こんな感じで書く。

 Hoge foo = new Hoge(); // C# or Java
 Hoge foo;              // C++
 Hoge* foo = new Hoge;  // C++

としてインスタンス化したときに,foo のメンバ i は42になる。

** デストラクタ [#m7a11b96]
インスタンスが破棄されるときに自動実行。~
引数と返り値を持たない。~
名前はクラス名の先頭にチルダ( ~ )を付けたもの。(命名規則はC++限定)

 // C++
 class Hoge{
   private:
     int i;
   public:
     ~Hoge(){
       i = 0;
     }
 };

こんな風に書くとインスタンスの破棄時にiが0になります。

C++の場合

 Hoge* foo = new Hoge();

として

 delete foo;

なんて書くとデストラクタが実行されるわけですな。~
ただ,Javaなんかだと delete 演算子が無いので、莫大なメモリを確保するクラスがあって、そのメモリの解放をデストラクタに任せたりすると怖いことになるかも。~
(デストラクタが実行されないわけでは無くて、ガベージコレクタ任せなのでいつデストラクタが実行されるかわからないわけですよ。)
// Javaってデストラクタあったっけ?
// ↑ファイナライザなるものがガーベジコレクション時に実行される。