【轉】CString,string,char*綜合比較

(一)  概述算法

1.string和CString均是字符串模a板類;編程

2.string爲標準模板類(STL)定義的字符串類,已經歸入C++標準之中;數組

3.CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)爲Visual C++中最經常使用的字符串類,繼承自CSimpleStringT類,主要應用在MFC和ATL編程中,主要數據類型有char,wchar_t(unicode),TCHAR(ANSI與unicode都可); 安全

4.char*爲C編程中最經常使用的字符串指針,通常以’\0’爲結束標誌;函數

(二)  構造spa

1.string是方便的,能夠從幾乎全部的字符串構造而來,包括CString和char*;.net

2.CString次之,能夠從基本的一些字符串變量構造而來,包括char*等;指針

3.char*沒有構造函數,僅能夠賦值;code

4.char[]字符數組;blog

舉例:

char* psz = "joise";

CString cstr( psz );

string str( cstr );

(三)  運算符重載

a) operator=

1.string是最方便的,幾乎能夠直接用全部的字符串賦值,包括CString和char*;

2.CString次之,能夠直接用些基本的字符串賦值,包括char*等;

3.char*只能由指針賦值,而且是極危險的操做,建議使用strcpy或者memcpy,並且char*在聲明的時候如未賦初值建議先設爲NULL,以免野指針,令你抓狂;

舉例:

char *psz = NULL;

psz = new char[10]; //固然,以上的直接寫成char *psz = new char[10];也是同樣

memset( psz, 0, 10 );

strcpy( psz, 「joise」 );

CString cstr;

cstr = psz;

string str;

str = psz;

str = cstr;

delete []psz;

b) operator+

1.string與CString差很少,能夠直接與char*進行加法,但不能夠相互使用+運算符,即string str = str + cstr是非法的,須轉換成char*;

2.char*沒有+運算,只能使用strcat把兩個指針連在一塊兒;

舉例:

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 +=

1.string是最強大的,幾乎能夠與全部的字符串變量+=,包括CString和char*;

2.CString次之,能夠與基本的一些字符串變量進行+=而來,包括char*等;

3.char*沒有+=運算符,只能使用strcat把兩個指針連在一塊兒;

d) operator[]

1.CString最好,當越界時會拋出斷言異常;

2.string與char*下標越界結果未定義;

舉例:

char* psz = 「joise」;

CString cstr = psz;

cout << cstr[8];

string str = psz;

cout << str[8];

cout << psz[8];

e) operator== 、operator!=、operator> 、operator< 、operator>= 、perator<=

CString與string之間不能夠進行比較,但都可以與char*進行比較,而且比較的是值,而不是地址;

       cout << ( psz == cstr );

       cout << ( psz == str );

       cout << ( str == psz );

       cout << ( cstr == psz );//以上代碼返回均爲1

(四)  經常使用算法

a) 查找

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

b) 比較

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 注:返回值若是<0則前面的值小於後面的值,反之亦然

c) 替換

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

d) 插入

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

e) 增長

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

f) 截取

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

g) 移除

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

h) 轉換大小寫

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

i) 與其餘類型轉換

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

j) 格式化

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

k) 獲得長度

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

l) 判斷爲空

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

m) 重定義大小

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

n) 釋放資源

CString,string,char*的綜合比較---轉載 - myswirl - 漩渦的窩

 

(五)  安全性

CString > string > char*;

(六)  靈活性

CString > string >char*;

(七)  可移植性

char* = string > CString

(八)  總結

綜上所述,我我的認爲,在MFC、ATL中使用字符串儘可能使用CString,畢竟都是微軟的孩子,各方面都比其它更有優點,而在非微軟平臺上或對移植性要求較高的場合推薦使用string,標準模板庫提供了那麼強大的泛型算法,不必再本身去造車輪。

(九)  參考文獻

主要參考的是MSDN,就不一一列出了。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhoubl668/archive/2008/09/17/2940652.aspx

相關文章
相關標籤/搜索