C 風格字串,C++string類,MFC,CString類的區別。
轉自:http://www.cnblogs.com/lidabo/archive/2012/08/27/2658528.html
字串,顧名思義是由字元組成的字串,在標準C,標準C++,MFC中 字串這一功能的實現是不相同的,C++完全相容了C。
1. 標準C中的字串
在標準C中沒有string這樣的資料型別,C中的字串是有char型別的字元陣列或者char型別的字元指標來實現的。例如:
char name[26]="This is a C-style string"; 或者
char *name="This is a C-style string";
型別的字串以\0為結束標記,所佔記憶體是實際子符長度+1,其初始化和賦值都要逐個字元的賦值,修改不辨,粒度太小,很不直觀,是程式設計師分散了一些軟體的高階層面問題,如演算法,抽象資料型別或軟體構架。char *沒有建構函式,僅能由指標賦值,而且是一個極其危險的操作,在宣告char * 的時候如果沒有賦初值,建議先初始化為NULL,以免出現懸浮指標或者指向地址不明的指標,否則,出錯會讓你很爽!
標準C中是沒有string型別,但是在C中有string.h標頭檔案,需要注意的是此string.h中的string 非彼string,<string.h>標頭檔案中定義了一些我們經常用到的操作字串的函式,如複製函式strcpy,連線字串strcat,比較字串strcmp,這些函式的操作物件都是指向char *的字串。
2.標準C++中的string類
C++支援C風格字串的使用,而且引入了string類的概念,string為標準模板類STL定義的字串,幾乎可以從所有的字串構造出來。
string字串類的都檔案是<string>,並且要和using namespace std; 一起使用。標頭檔案<string>和標頭檔案<string.h>沒有任何關係,前者是標準C++中的模板庫類,後者是標準C中的包含常用C字串處理函式的標頭檔案,如strcmp,前者並非是後者的升級版。
要深刻理解標準C++中string是一個類, 如在標準C中定義如下:char * pt=NULL; 這無疑是正確的,但是在標準C++中定義 string *pt=NULL;這樣做編譯器不會有警告和錯誤,但是執行是就會有異常。這是因為string作為一個類,定義類的物件時要呼叫其建構函式的,上面的例子既沒有呼叫其建構函式,還把指標賦值為NULL,很明顯就會出錯的。正確的 方法是是new操作符,C++中的new不同於C中的malloc, new不但會分配一塊記憶體,還呼叫類的建構函式。string *pt=new("this is a c++-style string"); 或者不用指標 string str;系統自動呼叫預設的建構函式,構造一個string類的物件。
3. MFC中的CString類。
MFC中的字串類是CString,封裝了string的東西,並增加了一些介面,在功能上完全相容string類,而一些標準的C/C++不能直接對CString類進行操作,CString 類是微軟的visual c++提供的MFC裡面的一個類,所以只有支援MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用標準C++中的 string類了。另外,因為string類是在c++標準庫中,所以它被封裝在了std名稱空間中,使用之前需要宣告using namespace std;而CString類並不在std名稱空間中,因為它不是c++的標準庫,只是微軟的一個封裝庫。這點看來用string類的程式的移植性更好。CString和string提供的介面方法不同,對char*的轉換也不同。下面的轉換內容來自CSDNBLOG:http://blog.csdn.net/bitxinhai/article/details/2292014
4.1 CString 和string的轉換
stringstr="ksarea";
CStringcstr(str.c_str());//或者CString cstr(str.data());初始化時才行
cstr=str.c_str();或者cstr=str.data();
str=cstr.GetBuffer(0); //CString -> string
cstr.format("%s", str.c_str()); //string->CString
cstr.format("%s", str.data()); //string->CString
str = LPCSTR(cstr); //CString->string
/*c_str()和data()區別是:前者返回帶'/0'的字串,後者則返回不帶'/0'的字串*/
4.2.CString和int的轉換inti=123;
CStringstr;
str.format("%d",i);//int->CString 其他的基本型別轉化類似
i=atoi(str);//CString->int 還有(atof,atol)4.3.char*和CString的轉換CStringcstr="ksarea";
char* ptemp=cstr.getbuffer(0);
char* str;
strcpy(str,ptemp);//CString->char*
cstr.releasebuffer(-1);
char*str="lovesha";
CStringcstr=str;//char*->CString string型別不能直接賦值給CString至於int與float、string與char*之間的轉化可以使用強制轉化,或者標準庫函式進行。對於CString與其他型別的轉化方法很多,但其實都殊途同歸,朝著一個方向即將型別首先轉化為char*型別,因為char*是不同型別之間的橋樑。得到char*型別,轉化為其他型別就非常容易了。這篇文章: http://hi.baidu.com/sage_haokun/blog/item/a44b9733aa14d812ebc4afbc.html
,還不錯,主要講述CString和string的區別,感興趣的可以去瞅一下。
相關文章
- C風格字串字串
- Python基礎之好玩的字串格式化之類C風格Python字串格式化
- Google C++ 程式設計風格指南:類GoC++程式設計
- Google C++程式設計風格指南(三):C++ 類GoC++程式設計
- C# 結構體與類的區別C#結構體
- 網路A、B、C類IP地址的區別
- C++中結構體與類的區別C++結構體
- 同為部落格,不同風格 ——Hexo另類搭建Hexo
- JQ操作類與JS操作類的區別JS
- 擴 展Visual c++ MFC 類 庫 (轉)C++
- C/C++中的字串另類連線C++字串
- C#點滴 - 抽象類與介面區別C#抽象
- c# 中的靜態類(satic class)和具體類的區別及用法C#
- C#中類和結構的一個區別...C#
- Object類和String類equals方法的區別Object
- date類與calendar的區別
- 介面和抽象類的區別抽象
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- 圖解修改VC++6.0 MFC控制元件風格為XP風格圖解C++控制元件
- python新式類和舊式類區別Python
- 【C++】C++用new和不用new建立類物件區別C++物件
- 字串與日期型別轉換的工具類字串型別
- 偽類與偽元素的區別
- Python類、模組、包的區別Python
- C#虛基類繼承與介面的區別C#繼承
- 新手不能忽視的MFC程式設計之CStringC程式程式設計
- python 的類 模組 包的區別Python
- Java_Thread類的sleep()與SystemClock類的sleep()的區別Javathread
- 重貼:MFC類中獲得其它類指標 (轉)指標
- iOS分類(category)、類擴充套件(extension)、繼承的區別iOSGo套件繼承
- C++ 標準庫-字串 string 類C++字串
- Linux C 的風格Linux
- C++之函式模板與類别範本的區別(三)C++函式
- [C++]C風格、C++風格和C++11特性的執行緒池C++執行緒
- 抽象類和介面的區別抽象
- 抽象類與介面的區別抽象
- JAVA中介面和抽象類的區別Java抽象
- MDIFrameWnd類GetActiveFrame和MDIGetActive的區別