目次→言語リファレンス→変数とデータ型→
標準のデータ型→データ型修飾語→
CONST (Qualifier)←オリジナル・サイト
データ型やポインタ・データ型が、書き込み禁止(読み出し専用)であると指定します。
構文:
パラメータ:
datatype
標準、またはユーザ定義の、データ型の名前。
記述:
Const 修飾語のすぐ右の
datatype や
PTR は、書き込み禁止であることを意味します。
書き込み禁止 (
Const) 宣言は、'変化しないという約束'と読むことができるタイプ安全の基準です。
コンパイラは、変数とパラメタをチェック操作するために、const宣言を使います。データが変更できる状態なら、コンパイル時にエラーを発生させます。
コンパイル時に、すべてチェックするので、
Const 限定子を使うためのランタイム・オーバーヘッドは全くありません。
どのデータ型宣言の場所でも、Const を、使うことができます。
これは、変数、パラメタ、関数のリターン結果、ユーザ定義型の項目、タイプ別名、およびキャスティングを含んでいます。
datatype(データ型式)は、どんな内蔵の標準データ型でも、ユーザ定義型でもかまいません。
書き込み禁止変数は、initializer(初期化子)が必要です。さもないと、値の代入で、書き込み禁止変数を変更すると、コンパイラ・エラーになります。
initializer(初期化子)は、変数の宣言の後に現れる場合もあります。
非定数変数と定数変数の両方とも、定数パラメタを想定する手続きに渡すことができます。
しかし、定数変数を、非定数パラメタを取る手続きに渡すことはできません。コンパイル・エラーを発生させます。
手続きは、パラメタの定数性(const-ness)にもとづいて、多重定義(overload)することができます。
例えば、一つの手続きは、手続きの1つのバージョンが 'byref foo as bar' パラメタを取り、手続きの別のバージョンは 'byref foo as const bar' パラメタを取るというように、多重定義(overload)できます
ポインタ宣言と共に、ポインタ宣言のどの部分が書き込み禁止かを示すのに
Const を使用できます(他の全ての部分は、デフォルトで読み書き可能です)。
ポインタ・データ型の、書き込み禁止(read-only)の部分が、ポインタ自体(アドレス)の場合や、ポインタが示すもの(データ)の場合があります。また、その両方の場合もあります。
1以上のレベルの
PTR 間接指定をもった宣言で、右のほとんどの
PTR は、最も高いオーダーレベルの間接指定を示していて、したがって、最初に逆参考されます。
コンパイラは、const修飾語に関して、「8」レベルのポインタ間接指定で、内部の物理な限界があります。このため、8 レベル以上の間接指定を持っている
PTR データ型をもった
Const を使った場合の振舞いは、未定義です。
例:
'' Const 変数
'' const パラメタを取る場合の手続き
Sub proc1
( ByRef x As Const Integer )
'' x は、const なので、x の値を変えることができません
'' x = 10 '' は、コンパイル・エラーを起こします。
'' 表示としては、それを使うことができます
'' 必要なら、他の変数にそれを割り当てて使います。
Dim y As Integer
y = x
y = y * x + x
End Sub
'' const パラメタが無い場合の手続き
Sub proc2
( ByRef x As Integer )
'' 値を変えることができます
x = 10
End Sub
'' const 無しと、const 付きの変数を、それぞれ宣言します
Dim a As Integer
Dim b As Const Integer = 5
'' proc1() は、const 無しも、const 付きも、どちらの引数も受け入れます
'' proc1() は、渡された変数を変えないと約束するからです。
proc1
( a )
proc1
( b )
'' proc2() は、const 無しの引数を受け入れます
proc2
( a )
'' しかし、proc2() は、const 引数は受け入れません。
'' というのは、proc2() は、変数の値を変えるからです。
'' 'b'は、変えられないと、約束しました。
'' proc2( b ) '' は、コンパイル・エラーになります。
'' Const ポインタ」
'' integer (整数)
Dim x As Integer = 1
Dim y As Integer = 2
Dim z As Integer = 3
'' const変数を再割り当てするとき、
'' コンパイラは誤りを発生させることををチェックするために、
'' uncomment the assignments below.
'' 「非-コメント」、以下の課題
''
Scope
'' integer(整数型変数)へのポインタ
Dim p As Integer Ptr = @x
p = @y /' OK - ポインタを変えることができます '/
*p = z /' OK - データを変えることができます '/
End Scope
''
Scope
'' integer(整数) の定数へのポインタ
Dim p As Const Integer Ptr = @x
p = @y /' OK - ポインタを変えることができます '/
'' *p = z /' エラー - データは定数です '/
End Scope
''
Scope
'' integer(整数型変数)への、定数ポインタ
Dim p As Integer Const Ptr = @x
'' p = @y /' エラー - ポインタは定数です '/
*p = z /' OK - データを変えることができます '/
End Scope
''
Scope
'' integer(整数)の定数への、定数ポインタ
Dim p As Const Integer Const Ptr = @x
'' p = @y /' エラー - ポインタは定数 '/
'' *p = z /' エラー - データは定数 '/
End Scope
'' オーバーロード状態の手続きでの、Const パラメタ」
'' const パラメタが無い場合の手続き
Sub foo Overload
( ByRef n As Integer )
Print "called 'foo( byref n as integer )'"
End Sub
'' const パラメタがある場合の手続き
Sub foo Overload
( ByRef n As Const Integer )
Print "called 'foo( byref n as const integer )'"
End Sub
Dim x As Integer = 1
Dim y As Const Integer = 2
foo
( x )
foo
( y )
'' 出力:
'' called 'foo( byref n as integer )'
'' called 'foo( byref n as const integer )'
Sleep
QBからの違い:
参照: