1. 程式人生 > 實用技巧 >CString、string與char *的比較【完整版】

CString、string與char *的比較【完整版】

>>> hot3.png

(一)概述

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

轉載於:https://my.oschina.net/guyson/blog/314565