Const (限定符)
 
指定数据类型或指针数据类型是只读的。

语法

... As [Const] datatype [ [Const] Ptr ... ]

参数

datatype
标准或用户定义数据类型的名称。

说明

指定Const限定符右侧的datatype Ptr将被视为只读。只读(Const)声明是可以被视为“承诺不改变”的类型安全性的度量。编译器使用const声明来检查对变量和参数的操作,并且如果数据可能会发生变化,则在编译时生成错误。由于所有的检查都是在编译时进行的,所以使用Const限定符没有运行时开销。

Const可以在数据类型声明的任何地方使用。这包括变量,参数,函数返回结果,用户定义的类型字段,类型别名和转换。datatype 可以是任何内置的标准数据类型或用户定义的类型。

只读变量必须具有初始化器,因为通过赋值修改只读变量将生成编译器错误。初始化程序可能会在声明变量后出现。

非const和const变量都可以传递给一个期望一个const参数的过程。但是,一个const变量可能不会被传递给一个采用非const参数的过程,并且会产生一个编译错误。

程序可以根据参数的常量重载。例如,一个过程的一个版本采用'byref foo as bar'参数并且该过程的另一个版本采用'byref foo as const bar'参数,可能会重载一个过程。

使用指针声明,Const可用于指示指针声明的哪一部分是只读的(所有其他部分都是默认读写)。指针数据类型的只读部分可以是指针本身(地址),指针指向什么(数据)或两者。在具有多个级别Ptr间接的声明中,最右边的Ptr表示间接的最高级别,因此首先被取消引用。

编译器具有相对于const限定符的八(8)个指针间接级别的内部硬限制,并且使用Ptr具有大于八(8)个间接级别的数据类型的Const的行为是未定义的。

例子

''常数变量

''程序采用const参数
Sub proc1( ByRef x As Const Integer )

  '' can't改变x,因为它是const
  '' x = 10 ''编译错误

  ''但是我们可以在表达式中使用它
  ''将其赋值给其他变量
  Dim y As Integer
  y = x
  y = y * x + x

End Sub

''程序采用非常量参数
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 )

''但不是const参数,因为proc2()
'' might change the variable'我们的数据
'' promised that 'b'不会改变
'' proc2( b ) ''编译错误


''指针指针

''一个整数
Dim x As Integer = 1
Dim y As Integer = 2
Dim z As Integer = 3

''检查编译器是否生成错误
''当尝试重新赋值常量变量时??,
''取消下面的作业。

''
Scope
  ''指向整数的指针
  Dim p As Integer Ptr = @x

  p = @y       /' OK - pointer can be changed '/
  *p = z       /' OK - data can be changed '/

End Scope

''
Scope
  ''指向恒定整数的指针
  Dim p As Const Integer Ptr = @x

  p = @y       /' OK - pointer can be changed '/
  '' *p = z    /' Error - data is const '/

End Scope

''
Scope
  ''一个指向整数的常量指针
  Dim p As Integer Const Ptr = @x

  '' p = @y    /' Error - pointer is const '/
  *p = z       /' OK - data can be changed '/

End Scope

''
Scope
  ''指向常量整数的常量指针
  Dim p As Const Integer Const Ptr = @x

  '' p = @y    /' Error - pointer is const '/
  '' *p = z    /' Error - data is const '/

End Scope


''过载程序中的Const参数

''具有非常量参数的程序
Sub foo Overload( ByRef n As Integer )
  Print "称为“foo(byref n整数)”"
End Sub

''程序与const参数
Sub foo Overload( ByRef n As Const Integer )
  Print "称为'foo(byref n作为const整数)'"
End Sub

Dim x As Integer = 1
Dim y As Const Integer = 2

foo( x )
foo( y )

''OUTPUT:
'' called 'foo( byref n as integer )'
'' called 'foo( byref n as const integer )'

与QB差别

  • 新的FreeBASIC

参考