当对象Pascal中赋值运算符“:=”被重载时会发生什么?我主要是指哪个先计算,更重要的是如何(如果可能)改变这个顺序。这里有一个让我困扰的例子:
我这样声明TMyClass:
我这样声明TMyClass:
TMyClass = class
private
FSomeString: string;
class var FInstanceList: TList;
public
function isValid: boolean;
property SomeString: String write setSomeString;
end;
isValid
函数检查MyObject是否为nil
,以及悬空指针。
现在假设我想重载:=
运算符来将字符串分配给TMyClass。我还想检查我要分配这个字符串的对象是否是有效的对象,如果无效,则创建一个新对象,所以:
operator :=(const anewString: string): TMyClass;
begin
if not(result.isValid) then
result:= TMyObject.Create;
result.SomeString:= aNewString;
end;
简而言之,我希望结果能自动保留我所分配对象的指针。但是通过以下测试:
procedure TForm1.TestButtonClick(Sender: TObject);
var
TestObject: TMyObject;
begin
TestObject:= TMyObject.Create;
TestObject:= 'SomeString';
TestObject.Free;
end;
我认为实际上会先为result
中间变量赋值,然后在:=
代码执行后才将其分配给TestObject
,这是我的理解。
我的编程知识都是自学的,但这个例子表明我显然在某些基本概念方面错过了一些东西。
我知道有比重载:=
操作符更简单的方法来做到这一点,但出于科学好奇心,是否有任何方法使此代码工作?(无论多么复杂。)