关于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中,很多方法中的参数,以及对象引用,都是直接通过类对象赋值来实现,这样就为日后的程序留下了祸根()。
关于类对象的引用,就写到,有不妥的地方,还请各位多多指点。当然如果你更好的见解,不妨也告知我,谢谢。
- 关于DELPHI中的类对象以及类指针简单探讨总结。
- C++中指针,引用与const,以及const中的临时量对象的探讨
- Delphi中的类和对象
- Delphi中的类和对象
- delphi中的对象其实也是一种指针
- Delphi下使用指针的简单总结
- Delphi下使用指针的简单总结
- Delphi下使用指针的简单总结
- 批判,再批判!关于“探究:如何判断Delphi中的对象指针是否可用”!
- 谈谈Delphi中的类和对象
- 关于delphi对象存入Tlist中的使用
- c++中的类对象指针、对象引用、this指针
- c++类成员指针以及对象指针应用
- 关于Java中的对象名称以及对象
- 类中的构造函数与析构函数、函数重载以及this指针的总结
- Delphi对象指针小结
- Delphi对象指针小结 .
- C++指针探讨 函数对象
- Session丢失问题总结
- UNICODE 编程入门
- 最近关注了一下2006CAD三维建模设计大赛
- [VC++]得到字体高度,宽度
- Sql语句--删除重复列
- 关于DELPHI中的类对象以及类指针简单探讨总结。
- 实现SQL Server数据同步更新-均为SQL Server服务器
- 实用的cookie管理软件IECookiesView推荐
- 链接数据失败时候的连接方法
- JavaBeans 和 JavaServer Pages的结合
- Oracle 9i 对 CHAR 型字段类型的优化
- 无法在app_data目录中创建数据库的解决方法
- JSP学习心得
- Symbian开发小TIP:printf() 和 console