Dをつつく21-コンストラクタ。静的コンストラクタ。後ろの少年だぁあーれ♪
- 宣言文
- 実行順序
- 親クラスのコンストラクタを呼び出す方法
- 親クラスのコンストラクタが自動で呼び出されるか否か
- 他のコンストラクタの呼び出し方法
- 複数定義できるか否か
ボクの経験から言ってこれらのことを確認するプログラムを書くといいピヨ。 じゃあ早速コーディングしよう。
import std.stdio;
class Monster {
this() { writeln( "モンスターペアレント参上!" ); }
}
class Child {
this() { writeln( "子供が登校します。" ); }
this( ubyte count) {
this(); //他のコンストラクタを呼び出す
for( ubyte i = 0; i < count; i++) writeln( "わーい" );
}
}
int main( char[][] ) {
Child c = new Child( 3 );
return 0;
}
このプログラムを実行してみよう。次の様に表示されたはずピヨ。
モンスターペアレント参上!
子供が登校します。
わーい
わーい
わーい
どうやら 親クラスのコンストラクタは自動で呼び出される様だね。
じゃあ、どうしても呼び出したい時はどうするのかというと、 superを使うんだ。 サンプルプログラムのthis()の部分をsuper()に変えて実行してみよう
これで終わりと思った人も多いと思うけど、あと 静的コンストラクタ という機能があるピヨ。
早速コードを書いたピヨ。
import std.stdio;
class StaticFoo {
public:
static int X = 10;
static int Y = 10;
//static Z = X * Y;
static int Z;
static this() { Z = X * Y; }
}
int main( char[][] ) {
StaticFoo foo = new StaticFoo();
writeln( "静的フィールドZの値=", foo.Z );
return 0;
}
このサンプルコードで読み取れるけど、静的コンストラクタとは 静的フィールドを設定する為の機能だんだ。 静的フィールドは定数しか指定できないから、 計算が必要な静的フィールドの値を導出する場合は静的コンストラクタを使うんだ。
それを確かめたい人はコメントアウトされている部分の//記号を取って、 静的コンストラクタのコードともう1つのZフィールドのコードをを消してコンパイルしてみて。 そうすると・・・
staticconstrutor.d(7): Error: non-constant expression X * Yと表示されるピヨ。これで納得いったよね♪
それじゃあすっきりしたところでお終い。またみてね♪