- 追加された行はこの色です。
- 削除された行はこの色です。
* コンストラクタとデストラクタ [#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ってデストラクタあったっけ?
// ↑ファイナライザなるものがガーベジコレクション時に実行される。