delphi程序片断如下: aobj1 := TMyClass1.Create(1,2);
aobj2 := TMyClass1.Create(3,4);
aobj1 := aobj2;
P1 := @aobj1;
P2 := @aobj2;
if P1 = P2 then
ShowMessage('Equal');
aobj1.Free;
aobj2.Free;上面的代码为什么ShowMessage('Equal');从来不执行,同时,最后2句只能有一句,而如果两句都有,就出错?或者,对象变量赋值的本质是什么?
,
aobj2 := TMyClass1.Create(3,4);
aobj1 := aobj2;
P1 := @aobj1;
P2 := @aobj2;
if P1 = P2 then
ShowMessage('Equal');
aobj1.Free;
aobj2.Free;上面的代码为什么ShowMessage('Equal');从来不执行,同时,最后2句只能有一句,而如果两句都有,就出错?或者,对象变量赋值的本质是什么?
,
aobj1.Free;
aobj2.Free;
所以上述中有一个就够了 。
ShowMessage('Equal');
这句话比较的是地址不是内容~~
delphi程序片断如下: aobj1 := TMyClass1.Create(1,2);
aobj2 := TMyClass1.Create(3,4);
aobj1 := aobj2;
P1 := @aobj1;
P2 := @aobj2;
if P1 = P2 then
ShowMessage('Equal');
aobj1.Free;
aobj2.Free;上面的代码为什么ShowMessage('Equal');从来不执行,同时,最后2句只能有一句,而如果两句都有,就出错?或者,对象变量赋值的本质是什么?
,
*************************************************************
aobj1 := aobj2;
这句实际上是将aobj2指向了aobj1,同时你也丢失了aobj2!!!
注意:在Delphi中所有的对象实际上都是指针!!!
因为aobj1和aobj2都是指针,而且是不同的指针变量,所以他们在内存中的存储地址不一样,所以
if P1 = P2 then
ShowMessage('Equal');
永远也执行不来了!!!P1保存的是aobj1的地址,aobj1保存的是TMyClass1对象的首地址!!!
P2保存的是aobj2的地址,aobj2保存的是TMyClass1对象的首地址!!!你的错误在于没有理解Delphi中对象的操作!!!并且在Delphi中没有C++中的那种操作符重载的功能,所以没有办法通过=来比较两个类是否相同,你只能通过自定义的函数实现类似相等的问题!!!
delphi对象变量其实是个指针(4个字节),Create后在堆中创建对象,返回其地址给对象变量
aobj1 := TMyClass1.Create(1,2);
aobj2 := TMyClass1.Create(3,4); aobj1 := aobj2; //aobj1 也指向了aobj2的对象,在此丢失了对TMyClass1.Create(1,2)的引用,你将不能释放它,有内存问题 P1 := @aobj1; //p1,p2得到的是aobj1,aobj2的地址,而不是对象的地址
P2 := @aobj2; if P1 = P2 then //因为aobj1,aobj2的地址不相同,所以永远不成立
ShowMessage('Equal');
aobj1.Free; //aobj1 也指向了aobj2的对象,所以你对同一对象释放了两次
aobj2.Free; DELPHI一般不区分实际的对象与指向对象的指针(即我们所说的对象变量),所以很多人不能理解DELPHI里的对象