Const (Спецификатор)
 
Определяет, что тип данных или тип данных указателя только для чтения.

Синтаксис

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

Параметры

datatype
Название стандартного или пользовательского определяемого типа данных.

Описание

Определяет что datatype или Ptr с указанным спецификатором Const должен быть рассмотрен только для чтения. Только для чтения (Const) декларация - мера безопасности типа, которая может быть прочитана как  'обещание не изменяться.' Компилятор использует декларацию константы, чтобы проверить операции на переменных и параметрах и произвести ошибку во время компиляции, если их данные могут потенциально изменяться. Нет никаких накладных расходов при использовании спецификатора Const, поскольку все проверки осуществляются во время компиляции.

Const может использоваться везде, где проделываются объявления типов данных. Это включает переменные, параметры, функции возвращающие результаты, определяемые пользователем поля типа, псевдонимы типа и преобразования. datatype может быть любым встроенным стандартным типом данных или определяемым пользователем типом.

Переменные только для чтения должны иметь инициализатор, поскольку изменения переменной только для чтения путем присваивания будет создавать ошибку компилятора. Инициализатор может появиться после объявления переменной.

Не константные и константные переменные могут быть переданы в процедуру, ожидающий const параметр. Однако константные переменные не могут быть переданы в процедуру с не константным параметром , это приведет к ошибке компиляции.

Процедуры могут быть перегружены на основе const-ness параметров. Например процедура может быть перегружена, где один параметр процедуры имеет 'byref foo as bar' , а другая версия процедуры имеет параметр 'byref foo as const bar'.

С декларацией указателей, Const может быть использован для указания того, какая часть объявления указателя только для чтения (все остальные части по умолчанию для чтения и записи). Частью только для чтения типа данных указателя может быть сам (адрес) указателя,  то на что указывает стрелка (данные), или оба. В декларации с более чем одним уровнем коссвености Ptr , наиболее правый Ptr указывает на высокий уровень порядка косвенности и, следовательно, разыменовывается первым.

Компилятор имеет внутренний жесткий предел восьми (8) уровней коссвености указателя относительно константных спецификаторов и поведений с использованием Const с Ptr типами данных. Имеющие больше, чем восемь (8) уровней косвенности не определяются.

Пример

'' Константные переменные

'' Процедура , принимающая константный параметр
Sub proc1( ByRef x As Const Integer )

  '' нельзя изменить 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

'' объявить константную и неконстантную переменную
Dim a As Integer
Dim b As Const Integer = 5

'' proc1() будет принимать неконстантный или константный
'' аргумент, так как proc1() обещает не
'' изменять переменную, переданную ей.
proc1( a )
proc1( b )

'' proc2() будет принимать неконстантный аргумент
proc2( a )

'' но не константный аргумент, потому что proc2()
'' может изменять данную переменную, а мы
'' пообещали, что 'b' не изменится.
'' proc2( b ) '' ошибка компиляции


'' Константные указатели

'' целые
Dim x As Integer = 1
Dim y As Integer = 2
Dim z As Integer = 3

'' Чтобы проверить, что компилятор генерирует ошибки
'' при попытке присвоить константным переменным,
'' раскомментируйте присвоения ниже.

''
Scope
  '' Указатель на integer
  Dim p As Integer Ptr = @x

  p = @y       /' Хорошо - указатель может быть изменен '/
  *p = z       /' Хорошо - данные могут быть изменены '/

End Scope

''
Scope
  '' Указатель на константный integer
  Dim p As Const Integer Ptr = @x

  p = @y       /' Хорошо - указатель может быть изменен '/
  '' *p = z    /' Ошибка - данные являются константными '/

End Scope

''
Scope
  '' константный указатель на integer
  Dim p As Integer Const Ptr = @x

  '' p = @y    /' Ошибка - указатель является константным '/
  *p = z       /' Хорошо - данные могут быть изменены '/

End Scope

''
Scope
  '' константный указатель на константный integer
  Dim p As Const Integer Const Ptr = @x

  '' p = @y    /' Ошибка - указатель является константным '/
  '' *p = z    /' Ошибка - данные являются константными '/

End Scope


'' Константные параметры в перегруженной процедуре

'' процедура с неконстантным параметром
Sub foo Overload( ByRef n As Integer )
  Print "called 'foo( byref n as integer )'"
End Sub

'' процедура с константным параметром
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 )

'' Вывод:
'' вызывается 'foo( byref n as integer )'
'' вызывается 'foo( byref n as const integer )'

Отличия от QB

  • Новое в FreeBASIC

См. также