Оператор Let (Присваивание)
 
Указывает оператор присваивания, при перегрузке Оператора = (Присваивание)

Синтаксис

{ 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
Имя Type, Class, Union, или Enum
lhs
Переменная, чтобы присвоить.
rhs
Значение для присваивания.

Описание

Let используется для перегрузки Оператора = (Присваивание) и чтобы отличить его от оператора сравнения Оператор = (Равно).

lhs = rhs присвоит rhs в lhs , ссылаясь на процедуру оператора Let определенную typename.

Оператор Let (присваивание) должен быть определен, если неполная неявная копия не является достаточной. Это происходит в тех случаях, когда объект управляет динамически выделяемой памятью или другими ресурсами, которые должны быть специально скопированы (например, если указатель-элемент укажет на динамически-выделенную память, то неявный оператор присваивания просто скопирует значение указателя , вместо выделения памяти , а затем выполнит копию данных).
Примечание: Можно с уверенностью сделать проверку для самостоятельного присваивания в верхней части тела 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                                ''private указатель, чтобы избежать прямого доступа
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)

Различия диалектов

  • В диалектах -lang qb и -lang fblite, этот оператор не может быть перегружен.
  • В диалектах -lang qb и -lang fblite , выражение присваивания может предшествовать ключевому слову Let.

Отличия от QB

  • Нет

См. также