FreeBASIC Operator
目次→言語リファレンス→変数とデータ型→ユーザ定義型→OPERATOR←オリジナル・サイト
多重定義の演算子を、宣言、または定義します。
構文:
パラメタ:
typename
assignment_op
let += -= *= &= /= \= mod= shl= shr= and= or= xor= imp= eqv= ^=
unary_op
- not * -> abs sgn fix frac int exp log sin asin cos acos tan atn len sqr
binary_op
+ - * & / \ mod shl shr and or xor imp eqv ^ = <> < > <= >=
注意:
sqr は、fbc バージョン 1.06 からのみ、ユーザー定義型を受け入れるために演算子として多重定義できます。
記述:
=、
+、
cast のような、内蔵の演算子は、事前に、式に使われたときの振舞いを定義されています。
これらの演算子は、演算子の引数の、少なくとも 1 つが、
Type、
Class、
Enum、
Union データ型のときに、事前に定義された操作以外の何かをするように、多重定義できます。
演算子は関数そのものです。 演算子 '+' は、
Function Plus( A as DataType, B as DataType ) as DataType のような機能性を持ちます。
詳細については、
演算子の多重定義 を参照してください。
演算子は、パラメータとしてさまざまなデータ型を受け入れるために、多重定義できます。
Cast 演算子は、戻り型だけが異なるが、宣言されている
Type,
Class, 又は
Union と同じでない場合に、複数回宣言できる唯一の演算子(または関数)です。(明示的な使用方法ではないため、コンパイラは、オブジェクトの使われ方に基づいて、呼び出す cast 多重定義を決定します。)
非静的演算子メンバーは、
Type,
Class, または
Union の内側で宣言されます。
グローバル演算子は、外部で宣言されます。 すべての演算子定義(手続き本体)は外側に現れなければなりません。
Let,
Cast, その他の代入演算子は、
Type,
Class, または
Union の中で宣言する必要があります。
すべての非静的メンバ手続きとして、これらは隠された
this パラメータを渡します。
単項演算子(変数1つに使用できる演算子)は、
Type,
Class, または
Union の外側で宣言し、戻りデータ型を明示的に宣言する必要があります。
Type,
Class, または
Union データ型を返さなければならない
演算子 -> (メンバーアクセスへのポインタ) を除いて、単項演算子は、任意の有効なデータ型を返すために、多重定義できます。
二項演算子は、
Type,
Class, または
Union の外側で宣言し、戻りデータ型を明示的に宣言する必要があります。
二項演算子は、関係演算子を含め、有効なデータ型で多重定義できます。関係演算子も、任意の有効なデータ型を返すことができます。
Let は、
LET a=b の場合のように、代入演算子を参照します。
Let 予約語は、通常の使用では、省略します。
-lang fb 方言では、使えません。
しかし、
Let() は、UDT の項目を、複数の変数に割り当てるために、使うことができます。
メンバー演算子
New,
New[],
Delete,
Delete[] は、
Type や
Class や
Union 内で宣言されていますが、明示的に宣言されていなくても常に静的です。
(
static キーワードは不要ですが、使うことはできます)
例:
'' operator1.bas
Type Vector2D
As Single x, y
'' ベクトルデータを含む文字列を返します
Declare Operator Cast() As String
'' ベクトルにスカラーを掛けます
Declare Operator *= ( ByVal rhs As Single )
End Type
'' 2つのベクトルを、合算できるようにします
Declare Operator + ( ByRef lhs As Vector2D, ByRef rhs As Vector2D ) As Vector2D
'' 多重定義の演算子 abs() を使って、ベクトルの絶対値(単精度)を返します
Declare Operator Abs ( ByRef rhs As Vector2D ) As Single
Operator Vector2D.cast () As String
Return "(" + Str(x) + ", " + Str(y) + ")"
End Operator
Operator Vector2D.*= ( ByVal rhs As Single )
This.x *= rhs
This.y *= rhs
End Operator
Operator + ( ByRef lhs As Vector2D, ByRef rhs As Vector2D ) As Vector2D
Return type<Vector2D>( lhs.x + rhs.x, lhs.y + rhs.y )
End Operator
Operator Abs ( ByRef rhs As Vector2D ) As Single
Return Sqr( rhs.x * rhs.x + rhs.y * rhs.y )
End Operator
Dim a As Vector2D = type<Vector2D>( 1.2, 3.4 )
Dim b As Vector2D = type<Vector2D>( 8.9, 6.7 )
Dim c As Vector2D = type<Vector2D>( 4.3, 5.6 )
Print "a = "; a, "abs(a) ="; Abs( a )
Print "b = "; b, "abs(b) ="; Abs( b )
Print "a + b = "; a + b, "abs(a+b) ="; Abs( a + b )
Print "c = "; c, "abs(c) ="; Abs( c )
Print "'c *= 3'"
c *= 3
Print "c = "; c, "abs(c) ="; Abs( c )
Sleep
整列メモリ配置:
-
多重定義されたメンバー演算子 "New" と "Delete" を使って、作成された全てのユーザ・オブジェクトを、複数の "ALIGN" バイト(この例では 256バイト)に整列します。
-
割り当てられたメモリの実際のポインターは、パディング・ブロックの中の、ちょうどユーザ・ポインター上に保存されます。
'' operator2.bas
Const ALIGN = 256
Type UDT
Dim As Byte a(0 To 10 * 1024 * 1024 - 1) '' 10 megabyte fixed array
Declare Operator New (ByVal size As UInteger) As Any Ptr
Declare Operator Delete (ByVal buffer As Any Ptr)
Declare Constructor ()
Declare Destructor ()
End Type
Operator UDT.New (ByVal size As UInteger) As Any Ptr
Print " Overloaded New operator, with parameter size = &h" & Hex(size)
Dim pOrig As Any Ptr = CAllocate(ALIGN-1 + SizeOf(UDT Ptr) + size)
Dim pMin As Any Ptr = pOrig + SizeOf(UDT Ptr)
Dim p As Any Ptr = pMin + ALIGN-1 - (CULng(pMin + ALIGN-1) Mod ALIGN)
Cast(Any Ptr Ptr, p)[-1] = pOrig
Operator = p
Print " real pointer = &h" & Hex(pOrig), "return pointer = &h" & Hex(p)
End Operator
Operator UDT.Delete (ByVal buffer As Any Ptr)
Print " Overloaded Delete operator, with parameter buffer = &h" & Hex(buffer)
Dim pOrig As Any Ptr = Cast(Any Ptr Ptr, buffer)[-1]
Deallocate(pOrig)
Print " real pointer = &h" & Hex(pOrig)
Sleep
End Operator
Constructor UDT ()
Print " Constructor, @This = &h" & Hex(@This)
End Constructor
Destructor UDT ()
Print " Destructor, @This = &h" & Hex(@This)
End Destructor
Print "'Dim As UDT Ptr p = New UDT'"
Dim As UDT Ptr p = New UDT
Print " p = &h" & Hex(p)
Print "'Delete p'"
Delete p
出力例:
'Dim As UDT Ptr p = New UDT'
Overloaded New operator, with parameter size = &hA00000
real pointer = &h420020 return pointer = &h420100
Constructor, @This = &h420100
p = &h420100
'Delete p'
Destructor, @This = &h420100
Overloaded Delete operator, with parameter buffer = &h420100
real pointer = &h420020
演算子 "
[]" の小さな用例:
バイト・バッファー用の最も単純なスマート・ポインター。
'' operator3.bas
'' スマート・ポインターとは、ポインターのように振舞うが、ポインター以上のことを行う、オブジェクトです:
'' - このオブジェクトは、ポインターのように柔軟で、オブジェクトであるという長所を持ちます。
'' 自動的に呼ばれた構築子、および廃却子のようです。
'' - したがって、スマートポインターの廃却子は,このオブジェクトが範囲から出る時、自動的に呼ばれます。
'' また、これはユーザ・ポインターを削除します。
'' バイト・バッファー用の最も単純なスマートポインターの例:
'' - 構築子と廃却子は、バイト・バッファーを割り付けて、解放し、サイズ変更することができます。
'' - ポインター・インデックス演算子は、バッファー要素にアクセスできます。
'' - コピー構築子と代入演算子は、個人のセクションの中だけで宣言されます。
'' コピー構築と、どんな割り当ても許可しないためにです。
Type smartByteBuffer
Public:
Declare Constructor (ByVal size As UInteger = 0)
Declare Operator [] (ByVal index As UInteger) ByRef As Byte
Declare Destructor ()
Private:
Declare Constructor (ByRef rhs As smartByteBuffer)
Declare Operator Let (ByRef rhs As smartByteBuffer)
Dim As Byte Ptr psbb
End Type
Constructor smartByteBuffer (ByVal size As UInteger = 0)
This.destructor()
If size > 0 Then
This.psbb = New Byte[size]
Print "Byte buffer allocated"
End If
End Constructor
Operator smartByteBuffer.[] (ByVal index As UInteger) ByRef As Byte
Return This.psbb[index]
End Operator
Destructor smartByteBuffer ()
If This.psbb > 0 Then
Delete[] This.psbb
This.psbb = 0
Print "Byte buffer deallocated"
End If
End Destructor
Scope
Dim As smartByteBuffer sbb = smartByteBuffer(256)
For I As Integer = 0 To 255
sbb[I] = I - 128
Next I
Print
For I As Integer = 0 To 255
Print Using "#####"; sbb[I];
Next I
Print
End Scope
方言差:
参照:
ページ歴史:2021-11-18 04:00:52
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall