關(guān)于CString的兩個(gè)問題
讀CString,string,char*的綜合比較(一)
1 CString的基類
在《比較》一文中,寫到:
“CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)為Visual C++中最常用的字符串類,繼承自CSimpleStringT類,主要應(yīng)用在MFC和ATL編程中,主要數(shù)據(jù)類型有char(應(yīng)用于ANSI),wchar_t(unicode),TCHAR(ANSI與unicode均可);”
我第一感覺就是文章寫錯(cuò)了,因?yàn)槲铱催^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的源碼看,果然:
看來微軟在不知不覺中做了這么大的變化。
2
“string是方便的,可以從幾乎所有的字符串構(gòu)造而來,包括CString和char*;
CString次之,可以從基本的一些字符串變量構(gòu)造而來,包括char*等; ”
的確,如下的代碼是可以編譯的:
string sTest(strTest);
但是這是表明string比CString方便嗎?
實(shí)際上,在string sTest(strTest);中有一個(gè)函數(shù)被調(diào)用,就是:
{ return m_pchData; }
然后才是string構(gòu)造生成,這能說是string比CString方便嗎?應(yīng)該說是CString比string方便才好。
雖然可以用
來初始化CString,但是CString沒有參數(shù)為string的構(gòu)造函數(shù),也是一個(gè)小小的遺憾,畢竟string是c++標(biāo)準(zhǔn)庫的一部分了。

