無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

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
と表示されるピヨ。これで納得いったよね♪
それじゃあすっきりしたところでお終い。またみてね♪
別窓 | D | コメント:0 | トラックバック:0 | ∧top | under∨
<<中の人の徒然草36 | 無差別に技術をついばむ鳥 | Dをつつく20−プロパティ。えっ!あったの?>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |