操作符 Let (Assign)
 
表示赋值运算符重载时操作符=(作业)

语法

{ Type | Class | Union | Enum } typename
Declare Operator Let ( [ ByRef | ByVal ] rhs As datatype )
End { Type | Class | Union }

Operator typename .Let ( [ ByRef | ByVal ] rhs As datatype )

用法

lhs = rhs

参数

typename
TypeClassUnionEnum的名称
lhs
要赋值的变量。
rhs
要赋值的值。

说明

Let用于重载操作符 = (赋值)运算符,并将其与比较运算符操作符 = (Equal)区分开来。

lhs = rhs 将通过调用typename 中定义的Let操作符过程将rhs 赋值给lhs .
这包括通过使用Function = rhs (或function_identifier = rhs )赋值从函数按值返回的对象的情况。
目前不支持赋值一个数组。

如果浅层隐式副本不够,则必须定义运算符Let(assign)。这种情况发生在对象管理动态赋值的内存或需要特别复制的其他资源的情况下(例如,如果成员指针指向动态赋值的内存,则隐式赋值运算符将简单地复制指针值而不是赋值内存,然后执行数据副本)。
注意:在Let主体顶部进行自我赋值的检查是安全的(通过将隐式“this”实例的地址与“rhs”参数的地址进行比较)以避免如果先前赋值的内存首先被释放(见下面的例子)。

例子

Type UDT
  Public:
    Declare Constructor (ByVal zp As Const ZString Ptr)  ''具有字符串初始化器的构造函数
    Declare Operator Let (ByRef rhs As UDT)              ''运算符Let(赋值)
    Declare Function getString () As String              ''函数获取字符串
    Declare 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>("感谢重载运算符Let(assign)")
Print u.getString
Sleep

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

方言差异

与QB差别

  • 没有

参考