コンストラクタとデストラクタ

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

コンストラクタ

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

// C++
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になる。

デストラクタ

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

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

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

C++の場合

Hoge* foo = new Hoge();

として

delete foo;

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


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-02-23 (木) 23:33:34