この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン | |||
staticコンストラクタ [2009/02/03 07:20] admin |
— (現在) | ||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | {{indexmenu_n>22}} | ||
- | ====== staticコンストラクタ ====== | ||
- | |||
- | ref classやvalue classやinterfaceはそのstaticなメンバーを初期化するためにstaticコンストラクターを定義することができます。ただし以下の制限があります。 | ||
- | |||
- | * staticコンストラクタはprivateでなければなりません。 | ||
- | |||
- | * staticコンストラクタはランタイムにより自動的に呼ばれます。プログラムから明示的に呼び出すことはできません。 | ||
- | |||
- | Note:VC++2005のコンパイラはstaticコンストラクタをpublicにすることも、明示的に呼び出すこともできます。しかし、明示的に呼び出しても実際には呼び出されないようです。 | ||
- | |||
- | * staticコンストラクタはパラメータ(引数)を持てません。 | ||
- | |||
- | Note:static initonlyなメンバーは、宣言と同時に初期化するか、staticコンストラクタで初期化しなければなりません。 | ||
- | |||
- | * staticコンストラクタで例外が発生するとSystem::TypeInitializationExceptionがスローされます。しかし通常catchすることはできません。 | ||
- | |||
- | * staticデストラクタは存在しません。 | ||
- | |||
- | <code cpp> | ||
- | using namespace System; | ||
- | ref class A { | ||
- | public: | ||
- | static int a_; | ||
- | static A() | ||
- | { | ||
- | a_ += 10; | ||
- | } | ||
- | }; | ||
- | ref class B { | ||
- | public: | ||
- | static int b_; | ||
- | static B() | ||
- | { | ||
- | // a_ += 10; // error | ||
- | b_ += 10; | ||
- | } | ||
- | }; | ||
- | ref class C { | ||
- | public: | ||
- | static int c_ = 100; | ||
- | static C() | ||
- | { | ||
- | c_ = 10; | ||
- | } | ||
- | }; | ||
- | ref class D { | ||
- | public: | ||
- | static D() | ||
- | { | ||
- | Console::WriteLine(L"D is called"); | ||
- | } | ||
- | }; | ||
- | int main() | ||
- | { | ||
- | Console::WriteLine(A::a_); | ||
- | A::A(); | ||
- | Console::WriteLine(A::a_); | ||
- | Console::WriteLine(B::b_); | ||
- | Console::WriteLine(C::c_); | ||
- | System::Type^ t = D::typeid; | ||
- | Console::WriteLine(t->ToString()); | ||
- | return 0; | ||
- | } | ||
- | </code> |