FreeBASIC OpCast
目次→言語リファレンス→変数とデータ型→演算子一覧→Operator CAST←オリジナル・サイト
UDF(ユーザー定義型)の変数を、指定されたデータ型に変換する演算子
構文:
用法:
パラメタ:
typename
datatype
変換先の型の名前で、組込みデータ型(標準的なデータ型)か、typename と異なる UDT 型
expression
変換する式、typename のインスタンス
記述:
expression (
typename 変数) を、異なる
datatype に変えます。
Cast operator は、
Type や,
Class や,
Union 内で宣言しなければなりません。
すべての非静的メンバー手続きとしては、隠された
this パラメータを渡します。
Cast operator は、戻り値の型だけが異なる場合、複数回宣言することができる、唯一の演算子(または関数)です。しかし、中で宣言される、
Type や,
Class や,
Union と同じではありません。
Cast operator は、構築(初期化子付きで)と代入の、式の右側に使える変換を可能にします。(下記の
例 1を参照)
その明示的なフォームの用法
Cast( datatype, expression ) に加えて、
Cast operator は、
datatype への黙示的な変換ができます。(同じ下記の
例 1を参照)
この明示的でない使用法では、コンパイラは、オブジェクトの使われ方に基づいて、どの多重定義キャストを呼ぶかを決定します。(例えば、Print 予約語で、コンパイラは、定義されていれば、
Cast() As String 演算子を呼び出します)
注意:
多重定義された
Cast operator は、UDT インスタンス(組込み型変数でない)だけを変換できます。
それは、多重定義できるのが、メンバー
operator(グローバル演算子としてではない)としてだけだからです。
組込み型変数を、UDT(動かない構文:
Cast( UDT, built_in_type_variable ))に変換するために、UDT への最善の方法は、構築子や Let 演算子を定めることです。あるいは、参照戻しでなく
Cast operator を使うことです。
(by an assignment:
Cast( built_in_datatype, UDT_instance ) = built_in_type_variable).
(下記の
例 2 参照)
1つの UDT からもう一つの UDT への黙示的な変換のために、最初の UDT の
Cast operator は、第2の UDT で、(第2の優先順位で)構築子と Let 演算子を置き換えることができます。(下記の
例 3 と
例 4 参照)
警告:
値(ByRef でなく)で返す
Cast 演算子では、
expression が
typename のインスタンスの場合、一般的に
Return expression (あるいは
Operator = expression) などの終了コードを使わないでください。
このような
Cast 演算子コードは、
typename から
datatype への暗黙的な変換が、
datatype のため、合致する構築子(または Let 演算子)を介して、すでに存在しない限り、呼び出されたときに無限ループを誘発します。
優先度が高いからです。
(下記の
例 5 参照)
例 1:
Cast 演算子を用いた変換能力(明示と黙示)を示す、非常に単純な構文の例:
Type UDT
Dim As Integer I
Declare Operator Cast () As Integer
Declare Operator Cast () As String
End Type
Operator UDT.Cast () As Integer
Print "UDT.Cast() As Integer",
Return This.I
End Operator
Operator UDT.Cast () As String
Print "UDT.Cast() As String",
Return Str(This.I)
End Operator
Dim As UDT u
u.I = 12
Print Cast(Integer, u) '' 定義済み "Cast() As Integer" 演算子を使った明示的な変換
Print Cast(String, u) '' 定義済み "Cast() As String" 演算子を使った明示的な変換
Print u '' 定義済み "Cast() As String" 演算子を使った、コンパイラによる黙示的な変換
Print
u.I = 34
Dim As Integer J = Cast(Integer, u) '' 定義済み "Cast() As Integer" 演算子を使った、明示的な初期化による構築
Print J
Dim As Integer K = u '' 定義済み "Cast() As Integer" 演算子を用いた、コンパイラによる黙示的な初期化による構築
Print K
Print
u.I = 56
J = Cast(Integer, u) '' 定義済み "Cast() As Integer" 演算子を用いた明示的な代入
Print J
K = u '' 定義済み "Cast() As Integer" 演算子を用いた、コンパイラによる黙示的な代入
Print K
Print
u.I = 78
Dim As String S = Cast(String, u) '' 定義済み "Cast() As String" 演算子を用いた明示的な初期化による構築
Print S
Dim As String G = u '' 定義済み "Cast() As String" 演算子を用いた、コンパイラによる黙示的な初期化による構築
Print G
Print
u.I = 90
S = Cast(String, u) '' 定義済みの "Cast() As String" 演算子を用いた明示的な代入
Print S
G = u '' 定義済み "Cast() As String" 演算子を用いた、コンパイラによる黙示的な代入
Print G
Print
Sleep
例 2:
動作しない構文の回避策: UDT_instance = Cast( UDT, built_in_type_variable ):
(構築子、Let 演算子、および参照戻しの Cast 演算子を使う)
Type UDT
As Integer I
Declare Constructor ()
Declare Constructor (ByVal I0 As Integer)
Declare Operator Let (ByVal I0 As Integer)
Declare Operator Cast () ByRef As Integer
End Type
Constructor UDT ()
End Constructor
Constructor UDT (ByVal I0 As Integer)
Print "UDT.Constructor(Byval As Integer)",
This.I = I0
End Constructor
Operator UDT.Let (ByVal I0 As Integer)
Print "UDT.Let(Byval As Integer)",,
This.I = I0
End Operator
Operator UDT.Cast () ByRef As Integer
Print "UDT.Cast() Byref As Integer",,
Return This.I
End Operator
Dim As UDT u
'u = Cast(UDT, 12) '' unsupported - error 20: Type mismatch
u = UDT(34) '' 定義済み "Constructor(Byval As Integer)" を使う明示的な変換
Print u.I
Print
u = 56 '' 定義済み "Let(Byval As Integer)" 演算子を用いた、コンパイラによる黙示的な変換
Print u.I
Print
Cast(Integer, u) = 78 '' 定義済みの参照戻し "Cast() Byref As Integer" 演算子を用いた明示的な変換
Print u.I
Print
Sleep
例 3:
UDT1 から UDT2 への変換で、UDT2 の構築子と Let 演算子を使う:
Type _UDT1 As UDT1
Type UDT2
Dim As Integer I2
Declare Constructor ()
Declare Constructor (ByRef u As _UDT1)
Declare Operator Let (ByRef u As _UDT1)
End Type
Constructor UDT2 ()
End Constructor
Type UDT1
Dim As Integer I1
End Type
Constructor UDT2 (ByRef u As UDT1)
Print "UDT2.Constructor(Byref As UDT1)",
This.I2 = u.I1
End Constructor
Operator UDT2.Let (ByRef u As UDT1)
Print "UDT2.Let(Byref As UDT1)",,
This.I2 = u.I1
End Operator
Dim As UDT1 u1
u1.I1 = 123
Dim As UDT2 u2 = u1 '' 定義済み "UDT2.Constructor(Byref As UDT1)" を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print
u1.I1 = 456
u2 = u1 '' 定義済み "UDT2.Let(Byref As UDT1)" 演算子を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print
Sleep
例 4:
UDT1 から UDT2 に、UDT1 の Cast 演算子を使って変換:
Type UDT2
Dim As Integer I2
End Type
Type UDT1
Dim As Integer I1
Declare Operator Cast () As UDT2
End Type
Operator UDT1.Cast () As UDT2
Print "UDT1.Cast() As UDT2",,
Dim As UDT2 u
u.I2 = This.I1
Return u
End Operator
Dim As UDT1 u1
u1.I1 = 123
Dim As UDT2 u2 = u1 '' 定義済み "UDT1.Cast() As UDT2" 演算子を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print
u1.I1 = 456
u2 = u1 '' 定義済み "UDT1.Cast() As UDT2" 演算子を用いた、コンパイラによる黙示的な変換
Print u2.I2
Print
Sleep
例 5:
UDT1 から UDT2 への変換。
UDT1 で、存在している Return This による Cast 演算子を使う。UDT2 の合致する Let 演算子のおかげで、無限ループはない。
Type _UDT1 As UDT1
Type UDT2
Dim As Integer I2
Declare Operator Let (ByRef u As _UDT1)
End Type
Type UDT1
Dim As Integer I1
Declare Operator Cast () As UDT2
End Type
Operator UDT1.Cast () As UDT2
Print "UDT1.Cast() As UDT2"
Return This '' 定義済み "UDT2.Let(Byref As UDT1)" 演算子を用いた、コンパイラによる黙示的な変換
End Operator
Operator UDT2.Let (ByRef u As UDT1)
Print "UDT2.Let(Byref As UDT1)"
This.I2 = u.I1
End Operator
Dim As UDT1 u1
u1.I1 = 123
Print Cast(UDT2, u1).I2
Sleep
方言差:
QBからの違い:
参照:
ページ歴史:2019-09-18 04:10:43
日本語翻訳:WATANABE Makoto、原文著作者:fxm