FreeBASIC マニュアルのトップに戻る

FreeBASIC Operator

目次→言語リファレンス→変数とデータ型→ユーザ定義型OPERATOR←オリジナル・サイト

OPERATOR 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


多重定義の演算子を、宣言、または定義します。

構文:
{ Type | Class | Union } typename
declare Operator cast () [ byref ] as datatype
declare Operator @ () [ byref ] as datatype ptr
declare Operator assignment_op ( [ byref | byval ] rhs as datatype )
declare Operator [] ( index as datatype ) [ byref ] as datatype
declare Operator new ( size as uinteger ) as any ptr
declare Operator new[] ( size as uinteger ) as any ptr
declare Operator delete ( buf as any ptr )
declare Operator delete[] ( buf as any ptr )
End { Type | Class | Union }

{ Type | Class | Union } typename
declare Operator For ()
declare Operator For ( [ byref | byval ] stp as typename )
declare Operator Step ()
declare Operator Step ( [ byref | byval ] stp as typename )
declare Operator Next ( [ byref | byval ] cond as typename ) as Integer
declare Operator Next ( [ byref | byval ] cond as typename, [ byref | byval ] stp as typename ) as Integer
End { Type | Class | Union }

declare Operator unary_op ( [ byref | byval ] rhs as datatype ) as datatype
declare Operator binary_op ( [ byref | byval ] lhs as datatype, [ byref | byval ] rhs as datatype ) as datatype

Operator typename.cast () [ byref ] as datatype [ Export ]
Operator typename.@ () [ byref ] as datatype ptr [ Export ]
Operator typename.assignment_op ( [ byref | byval ] rhs as datatype ) [ Export ]
Operator typename.[] ( index as datatype ) [ byref ] as datatype [ Export ]
Operator unary_op ( [ byref | byval ] rhs as datatype ) as datatype [ Export ]
Operator binary_op ( [ byref | byval ] lhs as datatype, [ byref | byval ] rhs as datatype ) as datatype [ Export ]
Operator typename.new ( size as uinteger ) as any ptr [ Export ]
Operator typename.new[] ( size as uinteger ) as any ptr [ Export ]
Operator typename.delete ( buf as any ptr ) [ Export ]
Operator typename.delete[] ( buf as any ptr ) [ Export ]

パラメタ:
typename
Type か、Class か、Union か、Enum の名前
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 つが、TypeClassEnumUnion データ型のときに、事前に定義された操作以外の何かをするように、多重定義できます。

演算子は関数そのものです。 演算子 '+' は、 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 の項目を、複数の変数に割り当てるために、使うことができます。

ユーザー定義型に、For..Next 命令文を多重定義することの詳細は、ForStepNext を、参照ください。

メンバー演算子 New, New[], Delete, Delete[] は、TypeClassUnion 内で宣言されていますが、明示的に宣言されていなくても常に静的です。
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


整列メモリ配置:
'' 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

ホームページのトップに戻る

表示-非営利-継承