CString、string与char *的比较(转帖)
(一)概述
string和CString均是字符串模板类,string是标准模板类(STL)定义的字符串类,已经纳入C++标准之中;
CString 为visual c++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);
char *为c编程中最常用的字符串指针,一般以‘\0’为结束标志;
(二)构造
string是方便的,可以从几乎所有的字符串构造而来,包括CString和char *;
CString次之,可以从一些基本的字符串变量构造而来,包括char*等;
char*没有构造函数,仅仅可以赋值;
eg:
char * psz = ”momo“;
CString cstr(psz);
string str(cstr);
(三) 运算符重载
a) operator=
string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*;
CString次之,可以直接用些羁绊的字符串赋值,包括char*等;
char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如果未赋值,建议先设置为NULL,避免野指针。
eg:char *psz = NULL;
psz = new char[10]; //也可以直接写为char *psz = new char[10];
memset(psz, 0, 10);
strcopy(psz, "joise");
CString cstr;
cstr = psz;
string str;
str = psz
str = cstr;
delete [] psz;
b) operator+
string与CString差不多,可以直接与char*进行加法,但是不可以互相使用+运算符,即string str = str + cstr是非法的。必须有一个操作数为
a null-terminated character 。char*, 或者” ... “;
char* 没有+运算,只能使用strcat把两个指针连在一起
eg:
char * psz = "joise";
CString cstr = psz;
cstr = cstr + psz;
string str = psz;
str = str + str + psz;
strcat(psz, psz);
strcat(psz, cstr); //合法
strcat(psz, str); //非法,由此可见,CString可以自动转换为const char*,而string不行。
c)operator +=
string几乎可以和所有的字符串变量+=,包括CString和char*;
CString次之,可以与基本的一些字符串变量进行+=,包括char*等;
char*没有+=运算符,只能用strcat把两个指针连在一起
d) operator [ ]
CString最好,当越界时会抛出断言异常;
string与char*下标越界结果未定义
eg:
char *psz = ”momo“;
CString cstr = psz;
cout<<cstr[8];
string str = psz;
cout<<str[8];
cout<<psz[8];
e) operator == 、operator !=、 operator>、operator<、operator>=、operator<=
CString与string之间不可以进行比较,但是均可以与char*进行比较,并且比较的是值,而不是地址
cout<<(psz == cstr);
cout<<(psz == str);
cout<<(str == psz);
cout<<(cstr == psz); //以上均可。
(四)常用算法
a)查找
注:find_if中是把范围内的值挨个代入匹配函数直至返回true;
b)比较
c)替换
d)插入
e)增加
f)截取
g)移除
h)转换大小写
i)与其他类型转换
j)格式化
k) 得到长度
l) 判断为空
m)重定义大小
n) 释放资源
(五)安全性
CString >string>char*
(六)灵活性
CString >string>char*
(七)可移植性
char*>string>CString
string和CString均是字符串模板类,string是标准模板类(STL)定义的字符串类,已经纳入C++标准之中;
CString 为visual c++中最常用的字符串类,继承自CSimpleStringT类,主要应用在MFC和ATL编程中,主要数据类型有char(应用于ANSI),wchar_t(unicode),TCHAR(ANSI与unicode均可);
char *为c编程中最常用的字符串指针,一般以‘\0’为结束标志;
(二)构造
string是方便的,可以从几乎所有的字符串构造而来,包括CString和char *;
CString次之,可以从一些基本的字符串变量构造而来,包括char*等;
char*没有构造函数,仅仅可以赋值;
eg:
char * psz = ”momo“;
CString cstr(psz);
string str(cstr);
(三) 运算符重载
a) operator=
string是最方便的,几乎可以直接用所有的字符串赋值,包括CString和char*;
CString次之,可以直接用些羁绊的字符串赋值,包括char*等;
char*只能由指针赋值,并且是极危险的操作,建议使用strcpy或者memcpy,而且char*在声明的时候如果未赋值,建议先设置为NULL,避免野指针。
eg:char *psz = NULL;
psz = new char[10]; //也可以直接写为char *psz = new char[10];
memset(psz, 0, 10);
strcopy(psz, "joise");
CString cstr;
cstr = psz;
string str;
str = psz
str = cstr;
delete [] psz;
b) operator+
string与CString差不多,可以直接与char*进行加法,但是不可以互相使用+运算符,即string str = str + cstr是非法的。必须有一个操作数为
a null-terminated character 。char*, 或者” ... “;
char* 没有+运算,只能使用strcat把两个指针连在一起
eg:
char * psz = "joise";
CString cstr = psz;
cstr = cstr + psz;
string str = psz;
str = str + str + psz;
strcat(psz, psz);
strcat(psz, cstr); //合法
strcat(psz, str); //非法,由此可见,CString可以自动转换为const char*,而string不行。
c)operator +=
string几乎可以和所有的字符串变量+=,包括CString和char*;
CString次之,可以与基本的一些字符串变量进行+=,包括char*等;
char*没有+=运算符,只能用strcat把两个指针连在一起
d) operator [ ]
CString最好,当越界时会抛出断言异常;
string与char*下标越界结果未定义
eg:
char *psz = ”momo“;
CString cstr = psz;
cout<<cstr[8];
string str = psz;
cout<<str[8];
cout<<psz[8];
e) operator == 、operator !=、 operator>、operator<、operator>=、operator<=
CString与string之间不可以进行比较,但是均可以与char*进行比较,并且比较的是值,而不是地址
cout<<(psz == cstr);
cout<<(psz == str);
cout<<(str == psz);
cout<<(cstr == psz); //以上均可。
(四)常用算法
a)查找

注:find_if中是把范围内的值挨个代入匹配函数直至返回true;
b)比较

c)替换

d)插入


f)截取

g)移除

h)转换大小写

i)与其他类型转换

j)格式化

k) 得到长度

l) 判断为空

m)重定义大小

n) 释放资源

(五)安全性
CString >string>char*
(六)灵活性
CString >string>char*
(七)可移植性
char*>string>CString