1. 程式人生 > >C++筆記(cstring和string的區別)

C++筆記(cstring和string的區別)

1.string與cstring有什麼區別

<string>是C++標準庫標頭檔案,包含了擬容器class std::string的宣告(不過class string事實上只是basic_string<char>的typedef),用於字串操作。
<cstring>是C標準庫標頭檔案<string.h>的C++標準庫版本,包含了C風格字串(NUL即'\0'結尾字串)相關的一些型別和函式的宣告,例如strcmp、strchr、strstr等。<cstring>和<string.h>的最大區別在於,其中宣告的名稱都是位於std名稱空間中的,而不是後者的全域性名稱空間。

看定義就知道了,string是新標準,定義了namespace std;而cstring雖然也是新標,但是定義中包含的是string.h。


string中可以進行+ = += >等運算,而cstring中不能進行相關運算。

1.

#include <cstring>   //不可以定義string s;可以用到strcpy等函式

using   namespace   std;

#include <string>   //可以定義string s;可以用到strcpy等函式
using   namesapce   std;

#include <string.h>   //不可以定義string s;可以用到strcpy等函式

2.

1)檔案cstring,和string.h對應,c++版本的標頭檔案,包含比如strcpy之類的字串處理函式
2)檔案string.h,和cstring對應,c版本的標頭檔案,包含比如strcpy之類的字串處理函式
3)檔案string,包含std::string的定義,屬於STL範疇
4)CString,MFC裡的的字串類

string.h是C語言中字串操作函式的標頭檔案
cstring是c++對C語言中的strcpy之類的函式申明,包含cstring之後,就可以在程式中使用C語言風格的strcpy之類的函式。

string是c++語言中string類模板的申明 
CString是MFC中定義的字串類,MFC中很多類及函式都是以CString為引數的,另外CString類過載了(LPCSTR)運算子,所以如果你在MFC下面使用CString類,就可以直接用CString類做為引數來呼叫需要一個C語言風格字串的win   api函式,編譯器會自動呼叫(LPCSTR)成員函式完成從CString到一個C風格字串的轉換。如果你在MFC下使用C++語言中標準的 string類,那麼在呼叫需要C語言風格的字串為引數的win   api時,你必須顯示呼叫sting.c_str()成員函式,來完成同樣的轉換,也就是說在使用MFC裡,如果用CString類,會比sting類方便那麼一點點。

3.

(1).首先說cstring與string.h:
cstring和string.h其實裡面都是C標準庫提供的東西,某些實現中cstring的內容
就是:  
  namespace   std  
  {  
  #include   <string.h>  
  }  
cstring是C++的組成部分,它可以說是把C的string.h的升級版,但它不是C的組成部分。
所以如果你用的是C++,那麼請用cstring,如果你用的是C請用string.h。

(2).string與cstring: 
一般一個C++庫老的版本帶“.h”副檔名的庫檔案,比如iostream.h,在新標準後的標準庫中都有一個不帶“.h”副檔名的相對應,區別除了後者的好多改進之外,還有一點就是後者的東東都塞進了“std”名字空間中。      
string,它是C++定義的std::string所使用的檔案,是string類的標頭檔案,屬於STL範疇。它有很多對字串操作的方法。

4.string.h是C++標準化(1998年)以前的C++庫檔案,在標準化過程中,為了相容以前,標準化組織將所有這些檔案都進行了新的定義,加入到了標準庫中,加入後的檔名就新增了一個"c"字首並且去掉了.h的字尾名,所以string.h標頭檔案成了cstring標頭檔案。但是其實現卻是相同的或是相容以前的。相當於標準庫組織給它蓋了個章,說“你也是我的標準程式庫的一份子了”

5.cstring代表的是string.h,但是被封裝到了std裡面,譬如呼叫strlen函式,需要寫成std::strlen(yourstr)才行,這個使用方法比較符合C++的標準要求string就是C++標準庫裡面的string模板(確切地說應該是一個特化的模板),但是他同樣包含了C風格字串操作函式的定義(應該是通過包含string.h實現的)string.h就不需要使用名字空間了,這個是C風格字串操作的一個函式庫,strlen,strcpy,strcat,strcmp……都在這裡面了,不過既然是C風格的庫,當然不需要namespace支援了。