STring与CSTring的区别和联系
CString:MFC里面封装的类。主要应用在MFC和ATL程中
主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);
动态的TCHAR数组。它是一个完全独立的类,封装了+等操作符和字符串操作方法。
String:标准模板类(STL)定义的字符串类//类似于Vector
string.h是C语言中字符串操作函数的头文件
cstring.h是c++对C语言中的strcpy之类的函数声明,包含cstring.h之后,就可以在程序中使用C语言风格的strcpy之类的函数。
转换:
CString→String
CString strMfc=_T("test");
std::string strStl ;
strStl=strMfc.GetString();
String→CString
CString strMfc;
std::string strStl="test";
strMfc=strStl.c_str();
构造
string可以从几乎所有的字符串构造而来,包括CString和char*;
CString次之,可以从基本的一些字符串变量构造而来,包括char*等;
char*没有构造函数,仅可以赋值;
eg:
char* pName = “jane”;
CString cstr( pName );
string str( cstr );
赋值
1、=
string 几乎可以直接用所有的字符串赋值,包括CString和char*;
CString 次之,可以直接用些基本的字符串赋值,包括char*等;
char* 只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如未赋初值建议先设为NULL,以避免野指针;
eg:
char *pName = NULL;
psz = new char[8]; //char *pName = new char[8];
memset( pName, 0, 8 );
strcpy( pName, "jane");
CString cstr;
cstr = pName;
string str;
str = pName;
str = cstr;
delete []pName;
对于字符数组与CString的转换,我们需要注意
行之有效的办法
BYTE pbuffer[255]={"hello,kitty,haoareyou?"};
CString mystr(pbuffer);//通过构造函数去解决赋值问题,CString mystr=pbuffer;是不对的
2、+
string与CString差不多,可以直接与char*进行加法,但不可以相互使用+运算符,即string str = str + cstr是非法的,须转换成char*;
char*没有+运算,只能使用strcat把两个指针连在一起;
eg:
char* pName = "jane";
CString cstr = pName;
cstr = cstr + pName;
string str = pName;
str = str + pName;
strcat( pName, pName);
strcat( pName, cstr ); // 合法
strcat( pName, str ); // 非法,由此可见,CString可自动转换为const char*,而string不行
3、+=
string 几乎可以与所有的字符串变量+=,包括CString和char*;
CString 次之,可以与基本的一些字符串变量进行+=而来,包括char*等;
char*没有+=运算符,只能使用strcat把两个指针连在一起;
4、[]
CString最好,当越界时会抛出断言异常;
string与char*下标越界结果未定义;
eg:
char* pName = "jane";
CString cstr = pName;
cout << cstr[8];
string str = psz;
cout << str[8];
cout << psz[8];
5、== 、!=、> 、< 、>= 、<=
CString与string之间不可以进行比较,但均可以与char*进行比较,并且比较的是值,而不是地址;
cout << ( pName == cstr );
cout << ( pName == str );
cout << ( str == pName);
cout << ( cstr == pName );//以上代码返回均为1