定数
定数とは初期化のタイミング以外で値を変更できない識別子のことを言います。グローバル領域またはローカル領域で定義することができ、参照方法は変数と同様です。
定数はオブジェクトメンバ及びクラスの静的メンバとして持つこともできます。
定数の定義
'一般の定数 Const name = expression '定数マクロ Const macro('args') = expression
項目
name、macro
- 定数名または定数マクロ名を指定します。
args
- マクロの場合はカッコ内にパラメータを指定します。カンマで区切って複数指定できます。置換ベースのマクロなので、型指定などは必要ありません。
expression
- 式を書きます。
備考
定数の初期値として代入する値がリテラル値の場合は、コンパイル時、その定数が参照される箇所にはリテラル値が置換されます。 定数の初期値が動的に変化する可能性を含む場合(変数や関数の戻り値など)は一般の変数と同様の領域に値が保有されます。この場合、初期化以外の場所で定数の値を変更しようとした場合、コンパイルエラーになります。また、このような定数を参照渡しパラメータとして指定することはできません。
オブジェクト メンバとしての定数
Classステートメント内にも定数を記述することができます。この場合、定数の初期化はコンストラクタでのみ行えます。コンストラクタ以外のメソッドや外部からメンバ定数の値を書き換えようとした場合、コンパイルエラーになります。
Class Foo Const N As Long Public Sub Foo() N=100 End Sub Sub Baz() 'コンパイルエラー N=200 End Sub ... End Class
クラスの静的メンバとしての定数
Classステートメント内においてStatic宣言で定数を定義した場合、その定数はクラスの静的メンバ定数になります。初期化はConstステートメントの右辺に指定します。
Class Foo Const N = 100 As Long ... End Class
定数の型がクラスの場合
一般的に定数というと、リテラル値または書き換え不可能な数値型として把握されがちですが、定数にはクラス型を指定することもできます(以下、オブジェクト定数)。
オブジェクト定数はそのクラスの内容を書き換えることは出来ません。一般的にメソッドを呼び出すこともできません。ただし、すべてのメソッドが呼べないとなると、クラスの機能を全く利用できなくなってしまいますので、下記の宣言がなされているメソッドのみ、例外的に呼び出すことが可能になっています。
Class Foo Public x As Long Sub Foo(x) This.x = x End Sub Readonly Sub Method1() ... End Sub Sub Method2() ... End Sub End Class Const obj As Foo(100) '正常(Readonlyなメソッドは呼び出し可能) obj.Method1() '一般メソッドを呼び出すとエラー obj.Method2() 'オブジェクトの内容を書き換えようとしてもエラー obj.x=200