深入剖析C++中的string類

來源:互聯網
上載者:User

comments:本文摘自於網路

 

一,C語言的字串

在C語言裡,對字串的處理一項都是一件比較痛苦的事情,因為通常在實現字串的操作的時候都會用到最不容易駕馭的類型——指標。

比如下面這個例子:

//example 1:

char str[12] = "Hello";

char *p = str;

*p = ''h'';  //改變第一個字母

 

//example 2:

char *ptr = "Hello";

*ptr = ''h'';  //錯誤

 

第一個字串時用數組開闢的,它是可以改變的變數。而第二個字串則是一個常量,也就是字面值。ptr只是指向它的指標而已,而不能改變指向的內容。

看兩者的彙編即可明了:

char p[] = "Hello";
004114B8  mov         eax,dword ptr [string "Hello" (4166FCh)]
004114BD  mov         dword ptr [ebp-10h],eax
004114C0  mov         cx,word ptr ds:[416700h]
004114C7  mov         word ptr [ebp-0Ch],cx

char *ptr = "Hello";
004114CB  mov         dword ptr [ebp-1Ch],offset string "Hello" (4166FCh)

可見用數組和用指標是完全不相同的。

要想通過指標來改變常量是錯誤,正確的寫法應該是用const指標。

const char *ptr = "Hello";

 

 

二,初識string類

正是因為C風格字串(以Null 字元結尾的字元數組)太過複雜難於掌握,不適合大程式的開發,所以C++標準庫定義了一種string類,定義在標頭檔<string>。注意<string.h>和<cstring>都是錯誤的,這兩個標頭檔主要定義C風格字串操作的一些方法,譬如strlen(), strcpy()等。第一個是C的標頭檔格式,而第二個是C++風格的標頭檔,但是和<string.h>是一樣的,它的目的是為了和C相容。

看下面例子:

//example 3:

string str("world");   //可以用C風格字串初始化

string words = "Hello";

string greet = words;

string  join = greet + words;  //可以像基本類型一樣操作

 

但是如果試圖把string類型的對象直接賦給C風格的字串的話,編譯器會報錯的。

string var = "Olympic";

char *ptr = var;  //error!

 

但是實際應用中這個問題也難以避免,很多時候我們還是需要將string類型的轉化為char*來實現自訂的操作,C++標準庫也為了和之前用C寫的程式相容,於是可以用string的c_str()函數。

string var = "Olympic";

char *ptr = var.c_str(); //還不能被編譯

 

或者通過const_cast去掉其const屬性亦可

char *ptr=const_cast<char *>(var.c_str()); //correct!

這樣就可以通過ptr修改其指向的地址空間內容

 

但是c_str()為了防止意外地修改string對象,返回的是const指標,所以上面這段代碼是不能被編譯的。正確的應該是用const指標。

string var = "Olympic";

const char *p = var.c_str(); //Correct!

 

這個c_str()方法在C++IO流操作上也被廣泛應用。

在開啟檔案時,如果要指定檔案名稱,可以用C風格的字串。如果用到string類型的字串作為檔案名稱時,就必須調用c_str()方法將其轉換為一個C風格字串。

//example 4:

string   filename;  //定義檔案名稱

cin >> filename;

ifstream.open(filename.c_str());  //要使用C風格字串

 

三, 深入瞭解string類

對string有一定瞭解以後,我們可以來瞭解C++標準庫定義的一系列豐富的字串操作,當然都是基於string類型。從某一種程度上來說,string就是一種字元容器。

標準庫為string定義了很多方法,包括構造、插入(insert)、替換(assign和replace)、比較(compare)、尋找(find)、刪除(erase)、串連(append)以及對子串的操作(substr)。而每一種操作都有很多種重載。

比如插入,除了包括標準容器的插入方式以外,string類本身還有一些特有的插入方法。

//example 5:

//與標準容器相同的插入操作:

str.insert(iter, value) //在迭代器iter之前插入value, 返回新元素的迭代器

str.insert(iter, n, value); //在迭代器iter之前插入n個value,返回void

str.insert(iter, begin, end); //在迭代器iter之前插入迭代器begin和end標記範圍內的元素,返回void

//string類特有的插入方法:

str.insert(pos, n, ch); //在下標為pos的字元之前插入n個字元ch

str.insert(pos, str2); //在下標為pos的字元之前插入string類型的對象str2的副本

str.insert(pos1, str2, pos2, len); //在下標為pos1的z字元之前插入string類型str2中從下表為pos2開始的len個字元

str.insert(pos, cp); //在下標為pos的字元前插入字元指標cp指向的C風格字串的副本

 

總之string是一種非常靈活的字串類型,標準庫讓我們可以忽略記憶體管理和具體實現方式,我們只需要關注其介面就好。並且初學者在使用字串的時候也應盡量使用這種類型,而不是C風格的字串。

當然,無C語言學習經曆的人可以例外。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.