现在的位置: 首页 > 综合 > 正文

CString、string与char *的比较(转帖)

2013年12月11日 ⁄ 综合 ⁄ 共 1846字 ⁄ 字号 评论关闭

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)查找

CString、string与char *的比较(转帖) - 默默 - 默默无闻
注:find_if中是把范围内的值挨个代入匹配函数直至返回true;

b)比较

CString、string与char *的比较(转帖) - 默默 - 默默无闻

c)替换

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
d)插入

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 

 e)增加

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
f)截取

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
g)移除

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
h)转换大小写

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
i)与其他类型转换

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
j)格式化

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
k) 得到长度

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
l)  判断为空

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
m)重定义大小 

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
n) 释放资源

CString、string与char *的比较(转帖) - 默默 - 默默无闻

 
(五)安全性
CString >string>char*

(六)灵活性
CString >string>char*

(七)可移植性
char*>string>CString

 

抱歉!评论已关闭.