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

FreeBASIC OpLet

目次演算子代入演算子Operator Let (Assign)←オリジナル・サイト

演算子 Let (代入) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


演算子 = (代入) を多重定義するとき、代入演算子を示します。

構文:
{ Type | Class | Union } typename
declare operator Let ( [ byref | byval ] rhs as datatype )
End { Type | Class | Union }

operator typename.Let ( [ byref | byval ] rhs as datatype )

用法:
lhs = rhs
or
lhs => rhs

パラメタ:
typename
TypeClassUnion の名前
lhs
代入先の変数
rhs
代入する値。

記述:
Let は、演算子 =[>] (代入) を多重定義するために使われます。また、演算子 = (代入)演算子 = (同等) を区別するために使われます。

lhs =[>] rhs は、typename に定義された Let 演算子手続きを起動して 、rhslhs に代入します。
これは、Function =[>] rhs (または function_identifier =[>] rhs) 代入を使って、値渡し関数から返されるオブジェクトの場合も含んでいます。
配列の代入は、現在、サポートされません。

演算子 Let (代入)は、浅い潜在的なコピー(参照型のコピー)が不十分なとき、定義しなければなりません。
これは、オブジェクトが、動的に割り当てられたメモリまたは、特にコピーされる必要がある他の資源を管理するケースで、起こります。
(たとえば、メンバー・ポインターが動的に割り当てられたメモリを示しているなら、暗黙の代入演算子が、メモリを割り当てる代わりに、単にポインター値をコピーして、そして、データのコピーを実行します。)

注意: 先に割り当てられたメモリが最初に解放される場合に、オブジェクト破壊を回避するために、Let 本体(暗黙の 'this' インスタンスのアドレスを 'rhs' パラメーターのアドレスと比較することによって)の一番上で、自己割り当てのチェックを行うことは、安全です。(下記の例を参照)

コピー代入のために演算子 Let (代入) を定義した場合、そのパラメーター (複製するオブジェクト) を値(by value)で渡すことはできません。

例:
Type UDT
  Public:
    Declare Constructor (ByVal zp As Const ZString Ptr)  ''constructor with string initializer
    Declare Operator Let (ByRef rhs As UDT)              ''operator Let (assignment)
    Declare Function getString () As String              ''function to get string
    Declare Destructor ()                                ''destructor
  Private:         
    Dim zp As ZString Ptr                                ''直接アクセスを回避するプライベート・ポインター
End Type

Constructor UDT (ByVal zp As Const ZString Ptr)
  This.zp = CAllocate(Len(*zp) + 1)
  *This.zp = *zp
End Constructor

Operator UDT.Let (ByRef rhs As UDT)
  If @This <> @rhs Then  '' オブジェクト破壊を回避するために自己割り当てをチェック
    Deallocate(This.zp)
    This.zp = CAllocate(Len(*rhs.zp) + 1)
    *This.zp = *rhs.zp
  End If
End Operator

Function UDT.getString () As String
  Return *This.zp
End Function

Destructor UDT ()
  Deallocate(This.zp)
End Destructor


Dim u As UDT = UDT("")
u = Type<UDT>("Thanks to the overloading operator Let (assign)")
Print u.getString
Sleep


出力:
Thanks to the overloading operator Let (assign)


方言差:

QBからの違い:

参照:
代入演算子 に戻る
演算子 に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2022-08-15 12:42:45
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

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

表示-非営利-継承