表示赋值运算符重载时
操作符=(作业)
语法
用法
lhs = rhs
参数
typename
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差别
参考