Posts Tagged CString
浅析VC.NET的CString类
Posted by kingsamchen in PROGRAMMING on 2010 年 08 月 26 日
对于使用MFC的Coder来说,CString肯定是一个经常要用到的类,它封装了一个字符串应具有的大部分功能,使得MFC的字符串操作不像C中那么痛苦。
而文本旨在通过对CString类源代码的一些分析,使得大家对于这个类具有更深入的了解,避免在以后使用过程中出错。
在进入正题前,要说点题外话:为什么是VC.NET的CString类?
答案很简单,在M$将MFC从4.X(VC6)升级到7.X(VC.NET)开始,原来的CString被重新设计以便与ATL共用,并且支持了template特性。而由于VC6对于C++标准支持差得令人发指,成为众矢之的,且逐渐式微,将成明日黄花,故这里分析VC.NET的CString类
1. 亲子疑团之谁是我爹
在新的MFC体系中,CString并不是一个实际存在的类,实际上存在的是CSimpleStringT和CStringT,而我们常用的CString只是一个typedef-class。
这种变动,无疑让CString的身世显得扑朔迷离。
CString童鞋内牛满面,不禁高呼:你们到底谁TM是俺爹?
CString是谁呢?呃,在经过一番从CString到它祖宗十八代的调查后,我们发现:CString的爹,其实是CSimpleStringT。而CStringT,则是CString的前世
2.亲子疑团之混乱的关系
CSimpleString是CString体系变化的一个代表。
在过去,CString实际上是个独立的类,据说连万物之祖——CObject和它都没有半毛钱关系。CString一个人负责内存管理、字符串操作.etc
而到了新体系下,AFX小组为了更好地与ATL重用,将CString功能分拆成两块:基本的内存管理和缓存操作以及高级的字符串处理。CSimpleStringT便是负责前者。
至于CStringT,便继承自CSimpleStringT,然后封装了高级的字符串处理。
那么,我们为什么说CStringT是CString的前世呢?因为下面一行代码
typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;
对于采用了模板的类来说,这种typedef并不少见,std::string也是一个typedef-class
PS1:CStringT最初在ATL中设计,并有了MFC支持版(二者应该区别不大),于是编译器分别提供了cstringt.h和atlstr.h
PS2:即使是现在,CSimpleStringT也是独立的类,与CObject仍然没有半毛钱关系
Read the rest of this entry »

COMMENTS