love in C++, live on MFC

to get ready...

C++博客 首页 新随笔 联系 聚合 管理
  47 Posts :: 0 Stories :: 97 Comments :: 0 Trackbacks

关于CString的两个问题
CString,string,char*的综合比较(一) 

1 CString的基类
在《比较》一文中,写到:
“CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)为Visual C++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);”
我第一感觉就是文章写错了,因为我看过CString的源码的啊:

struct CStringData
{
    
long nRefs;             // reference count

    int nDataLength;        // length of data (including terminator)
    int nAllocLength;       // length of allocation
    
// TCHAR data[nAllocLength]


    TCHAR
* data()           // TCHAR* to managed data
        return (TCHAR*)(this+1); }
}
;

class
 CString
{
public
:
//
 Constructors

    
// constructs empty CString

    CString();
    
// copy constructor

    CString(const CString& stringSrc);
    
// from a single character

    CString(TCHAR ch, int nRepeat = 1);
    
// from an ANSI string (converts to TCHAR)

    CString(LPCSTR lpsz);
    
// from a UNICODE string (converts to TCHAR)

    CString(LPCWSTR lpsz);
    
// subset of characters from an ANSI string (converts to TCHAR)

    CString(LPCSTR lpch, int nLength);
    
// subset of characters from a UNICODE string (converts to TCHAR)

    CString(LPCWSTR lpch, int nLength);
    
// from unsigned characters

    CString(const unsigned char* psz);

// Attributes & Operations

但是看文章的样子,也不像是粗制滥造的,心里很是疑惑。
后来再打开VC7的源码看,果然:

typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;

看来微软在不知不觉中做了这么大的变化。

2
“string是方便的,可以从几乎所有的字符串构造而来,包括CString和char*; 
 CString次之,可以从基本的一些字符串变量构造而来,包括char*等; ”
的确,如下的代码是可以编译的:

CString strTest = "test";
string sTest(strTest);

但是这是表明string比CString方便吗?
实际上,在string sTest(strTest);中有一个函数被调用,就是:

_AFX_INLINE CString::operator LPCTSTR() const
    { 
return m_pchData; }

然后才是string构造生成,这能说是string比CString方便吗?应该说是CString比string方便才好。
虽然可以用

CString strTest(sTest.c_str() );

来初始化CString,但是CString没有参数为string的构造函数,也是一个小小的遗憾,毕竟string是c++标准库的一部分了。

posted on 2006-03-02 09:29 flyingxu 阅读(1851) 评论(6)  编辑 收藏 引用 所属分类: C/C++VC/MFC

Feedback

# re: 关于CString的两个问题 2006-03-02 14:58 3×7=51
把CString和string,char*拿来比较也许有点不妥当.
CSting有时对应string,char*有时对应wstring,wchar_t*这取决于TCHAR的定义  回复  更多评论
  

# re: 关于CString的两个问题 2006-03-09 13:38 沐枫网志
c_str和operator const char*的争论由来已久。std因为安全的原因,选择了c_str,抛弃了operator const char*。
这一点对于程序员来说,也不在于好不好用的问题。

CString功能多,这是它好用的最大理由;相对来说string功能就很少。

Cstring最早是用于MFC。后来发展ATL后,ATL也就有了一个CString的轻量级模板实现。
所以发展到后面,干脆将MFC和ATL都经常用到的一些类,提出作为公共类,然后用typedef兼容MFC和ATL的旧有代码。因此,就有了CString的转变。  回复  更多评论
  

# re: 关于CString的两个问题 2006-03-11 20:58 nanami
如果在普通的C++项目里面添加CString头文件,好像编译的时候会出错,是不是需要设置关于MFC的参数?如何设置呢?  回复  更多评论
  

# re: 关于CString的两个问题 2006-03-16 17:09 flyingxu
@nanami
是的,要在project setting里面选一下 use MFC in...  回复  更多评论
  

# re: 关于CString的两个问题 2006-11-29 18:22 LeVaN
http://filmiki-najlepsze.lolas.pl">http://filmiki-najlepsze.lolas.pl ^^^ <a href="http://filmiki-najlepsze.lolas.pl">http://filmiki-najlepsze.lolas.pl">filmiki najlepsze</a> ^^^ [url]http://filmiki-najlepsze.lolas.pl">http://filmiki-najlepsze.lolas.pl[/url]  回复  更多评论
  

# re: 关于CString的两个问题 2006-12-06 12:44 littledovemm
楼主很强啊,找了很多地方,郁闷了很久,看到了你的文章。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理