目次→
演算子→
代入演算子→
Operator Let (Assign)←オリジナル・サイト
演算子 = (代入) を多重定義するとき、代入演算子を示します。
構文:
用法:
パラメタ:
typename
lhs
代入先の変数
rhs
代入する値。
記述:
lhs =[>] rhs は、typename に定義された Let 演算子手続きを起動して 、rhs を lhs に代入します。
これは、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からの違い:
参照: