FreeBASIC ByrefVariables
目次→言語リファレンス→変数とデータ型→変数の宣言→BYREF (variables)←オリジナル・サイト
参照を宣言します
構文:
or
or
[Static] Var [Shared] Byref name1 = variable1 [, Byref name2 = variable2, ...]
パラメタ:
name
参照名
variable
参照する変数名
記述:
変数に参照(名前で)を宣言します。
参照は、記憶域に位置するデータにアクセスする方法の実体です。
参照は、データそのものでなく、データの場所に関する情報だけです。
参照は、暗黙のうちに間接参照されるポインターとみなすことができます。
多くの場合、これをポインターに代わるものとして使うことができます。
変数が生成されるとき、参照は常に変数で初期化されなければなりません。
DataType は、変数の型と同じ型、または互換性のある型(たとえば、継承の場合はその基底の型の一つから)でなければなりません:
-
2つの型が同一の(または Var の第3の構文を使う)ときだけ、参照は変数の完全な別名と考えられます。
それは、それが最初の変数ですることができるのと同じ操作を、その参照を通してすることができます。
-
それ以外(互換性はあるが同一ではない)の場合は、元の変数と同じ操作を全て行うことができるわけではありません。
たとえば、派生型オブジェクトを参照する基本型参照は、仮想メソッドが呼び出されると多態性をアクティブにすることができます。派生型オブジェクトを参照する基本型ポインタと同様です。
それは、同じ型の逆参照されたポインタを使って行うことができるように、参照を介して同じ操作を行うことができます(ただし、派生型のインスタンスを直接使用するのと同じ操作ではありません)。
参照は、実行して、別の変数(互換性のある型)を参照するために再代入されることができます:
@refname = @othervariable
注意: 参照の配列と、UDT のための非静的参照項目は、まだサポートされていません。
例:
'' Comparison between:
'' - a copy ('ci') of a variable ('i')
'' - a reference ('ri') to a variable ('i')
Dim As Integer i = 12
Print @i, i
Dim As Integer ci = i '' or Var ci = i
Print @ci, ci
Dim ByRef As Integer ri = i '' or Var Byref ri = i
Print @ri, ri
Print
Print i, ci, ri
i = 34
Print i, ci, ri
ci = 56
Print i, ci, ri
ri = 78
Print i, ci, ri
Sleep
'' 参照を使うと、ポインターと比べて式を簡略化できます
'' (avoid to use operator '@' and especially '*')
Function fp () As ZString Ptr
Static As ZString * 256 z
Return @z
End Function
Dim As ZString Ptr pz = fp()
*pz = "FreeBASIC Zstring Ptr"
Print *pz
*pz &= " 1.3.0"
Print *pz
Print
Function fr () ByRef As ZString
Static As ZString * 256 z
Return z
End Function
Dim ByRef As ZString rz = fr() '' or Var Byref rz = fr()
rz = "FreeBASIC Zstring Ref"
Print rz
rz &= " 1.4.0"
Print rz
Sleep
'' 参照を再代入することができます。
'' 1つの参照だけで扱える、UDT で、オブジェクトの連続した構築と破壊をコントロールする例。
Type UDT
Declare Constructor ()
Declare Destructor ()
Dim As Integer I
End Type
Constructor UDT ()
Static As Integer nb
nb += 1
This.I = nb
Print "UDT.Constructor()"
End Constructor
Destructor UDT ()
Print "UDT.Destructor()"
End Destructor
Var ByRef ru = *New UDT '' or Dim Byref As UDT ru = *New UDT
Print ru.I
Delete @ru
Print
@ru = New UDT
Print ru.I
Delete @ru
Sleep
''
多型(継承と仮想性を使う)は、次の3種類のエンティティいずれかを介して活性化できます:
'' - 派生型オブジェクトを参照する基本型ポインタ、
'' - 派生型オブジェクトを参照する間接参照基本型ポインタ、
'' - 派生型オブジェクトを参照する基本型参照
'
''
下のコードの1行目を、TRUE でなく FALSE にすると、仮想性による多型は、アクティブ化されません。
#define virtuality TRUE
Type myBase Extends Object
#if virtuality = TRUE
Declare Virtual Sub hello()
#else
Declare Sub Hello()
#endif
End Type
Sub myBase.hello()
Print "myBase.hello()"
End Sub
Type myDerived Extends myBase
Declare Sub hello()
End Type
Sub myDerived.hello()
Print "myDerived.hello()"
End Sub
Dim As myBase mb
Dim As myBase Ptr pmb = @mb
Dim ByRef As myBase rmb = mb '' or Var Byref rmb = mb
pmb->hello() '' pmb は、基本型オブジェクトを参照する基本型のポインタです
(*pmb).hello() '' *pmb は、基本型オブジェクトを参照する間接参照されたベース型のポインタです
rmb.hello() '' rmb は、基本型オブジェクトを参照するベース型の参照です
Print
Dim As myDerived md
Dim As myBase Ptr pmd = @md
Dim ByRef As myBase rmd = md '' 構文だけ。参照データ型は、オブジェクトの型と異ならなければならないから。
pmd->hello() '' pmd は、派生型オブジェクトを参照する基本型のポインタです
(*pmd).hello() '' *pmd は派生型オブジェクトを参照する間接参照されたベース型のポインタです
rmd.hello() '' rmd は、派生型オブジェクトを参照するベース型の参照です
Sleep
バージョン:
方言差:
QBからの違い:
参照:
ページ歴史:2021-10-11 09:33:18
日本語翻訳:WATANABE Makoto、原文著作者:fxm