FreeBASIC マニュアルのトップに戻る

FreeBASIC ConstQualifier

目次→言語リファレンス→変数とデータ型→標準のデータ型→データ型修飾語→CONST (Qualifier)←オリジナル・サイト

CONST (限定子) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

データ型やポインタ・データ型が、書き込み禁止(読み出し専用)であると指定します。

構文:
... as [Const] datatype [ [Const] PTR ... ]

パラメータ:
datatype
標準、またはユーザ定義の、データ型の名前。

記述:
Const 修飾語のすぐ右の datatypePTR は、書き込み禁止であることを意味します。
書き込み禁止 (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からの違い:

参照:

標準のデータ型に戻る
←リンク元に戻る プログラム開発関連に戻る


ページ歴史:2016-03-12 15:58:04
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

ホームページのトップに戻る

表示-非営利-継承