关于DELPHI中的类对象以及类指针简单探讨总结。

来源:互联网 发布:交换机mac地址过滤 编辑:程序博客网 时间:2024/06/07 18:13

      最近用DELPHI写程序,发现了DELPHI类对象引用时,有个需要特别注意的地方,故总结如下,与大家分享。有讲的不对的地方,还请不吝斧正。

      
       首先:我们定义一个类,DELPHI定义类默认都是从TObject继承。
 TX = class
 public
    m_buf: string;
 end;
 
然后我们在定义TX的两个实例:
m_x1 : TX;
m_x2 : TX;
 
接着执行如下代码:
 m_X1 := TX.Create;
 m_x1.m_buf := 'welcome';
 m_x2 := m_x1;
 m_x1.Free;
 m_x1 := nil;
 
执行此段代码后,m_x1重新变成NIL(空),但m_x2并不为NIL空,所以
如果我们执行如下代码:
 if (m_x2 <> nil ) then
 begin
    ShowMessage(m_x2.m_buf);
 end;
 程序将会报错,因为m_x2指向m_x1,m_x1已经释放了,并且m_x1已经置为NIL,但是m_x2还是指向以前m_x1的地址,所以这时访问就会报错。问题在于m_x1置为NIL时,m_x2并没有也自动设置为NIL,所以需要程序时刻来记录m_x2的位置。
 
本人总结如下:在DELPHI中,当定义某个对象后,已经给此对象分配了一个地址。当执行对象赋值语句(类似m_x2 := m_x1)后,实际上m_x2是m_x1的一个引用,m_x2中的属性、方法都和m_x1是一摸一样的,也就是说m_x2就可以等同于m_x1。唯一的不同就是,m_x1,m_x2都有自己的地址。并且当m_x1释放并置空后,m_x2还是指向原来的地址(但是此地址空间已经不存在了),此时如果再访问m_x2就等于访问一块不存在的内存对象。所以,大家以后在用对象引用时,不能简单的判断此对象不是NIL,就可以访问。
 
为了避免无法判断m_x2是否可以使用,我想读者不妨采用指针的方式,例如:
m_x1 : TX;
m_X3 : ^TX;
 
 m_X1 := TX.Create;
 m_x1.m_buf := 'welcome';
 m_x3 := @m_x1;
 
此时,m_x3就是指向m_x1对象的地址。当m_x1释放并置空后,m_x3^指向的值,也相应为NIL.执行如下语句,就不会报错。
 if (m_x3^ <> nil ) then
 begin
    ShowMessage(m_x3^.m_buf);
 end;
 
       在C++中,我们引用一个对象,更多是用指针来引用,就可以避免在DELPHI中这种类似问题。但是在DELPHI中,很多方法中的参数,以及对象引用,都是直接通过类对象赋值来实现,这样就为日后的程序留下了祸根()。
      
       关于类对象的引用,就写到,有不妥的地方,还请各位多多指点。当然如果你更好的见解,不妨也告知我,谢谢。
原创粉丝点击