VC6的时候记得看过CString的源代码,并不复杂,应该是从VC7开始,MFC和ATL共用一个CString了,新的CString使用了模板技术和其它技术,值得一提。
先 看CString的定义:
typedef CAtlString CString;
如果想明确使用ANSI和UNICODE版本,可以使用CStringA和CStringW,看它们的定义:
typedef CAtlStringW CStringW;
typedef CAtlStringA CStringA;
以上三个Atl版本的String,其定义为:
typedef CStringT< wchar_t, StrTraitATL< wchar_t > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;
因此,CStringT才是真实的CString类。
template< typename BaseType, class StringTraits >
class CStringT :
public CSimpleStringT< BaseType, _CSTRING_IMPL_::_MFCDLLTraitsCheck<BaseType, StringTraits>::c_bIsMFCDLLTraits >
{
};
CStringT有两个模板参数,第一个表明字符类型,第二个参数从源代码中知道是StrTraitATL:
template< typename _BaseType = char, class StringIterator = ChTraitsOS< _BaseType > >
class StrTraitATL : public StringIterator
{
public:
static HINSTANCE FindStringResourceInstance(__in UINT nID) throw()
{
return( AtlFindStringResourceInstance( nID ) );
}
static IAtlStringMgr* GetDefaultManager() throw()
{
return( &g_strmgr );
}
};
从类声明看到他提供了一个字符串管理器,字符迭代器和从资源中获得字符串的功能。字符串管理器比较重要,后面会提到。
CStringT没有成员变量,封装了很多好用的字符串函数,数据在基类CSimpleStringT中。
CSimpleStringT只有一个成员变量m_pszData,不要小看这个变量,在它身上,有着