2011-07-26 15 views
0

在C++中創建的「字符串」類型如何?在C中,字符串是字符數組,但C++如何將字符數組轉換爲我們在C++中知道的「字符串」?如何在C++中創建字符串類型?

+0

你的意思是歷史細節?否則@戴夫的答案是正確的。 – iammilind

+0

@In silico - 更具體地說,我想弄清楚如何替代字符數組,可以定義一個「字符串」。編譯器在運行時是否將std :: string轉換爲字符數組?最後,如果不是,它如何分配內存? –

+1

@Josh Bartholf:你應該把它編輯成你的問題,這樣你可以得到更具體的答案。 –

回答

8

字符數組仍然在那裏,它只是一個類包裹它。想象一下這樣的事情:

class String 
{ 
private: 
    char* stringData; 

public: 
    String(const char* str) 
    { 
    stringData = new char[strlen(str)+1]; 
    strcpy(stringData, str); 
    } 

    ~String() { delete[] stringData; } 

    String& operator += (const String& rhs) 
    { 
    char* newStringData = new char[strlen(rhs) + strlen(stringData) + 1]; 
    strcpy(newStringData, stringData); 
    strcpy(newStringData + strlen(stringData), rhs); 
    delete[] stringData; 
    stringData = newStringData; 
    return *this; 
    } 
}; 

這顯然是一個非常不完整的例子,但你明白了吧?

std :: string的實際實現非常全面,但它不是你自己無法做到的。下面是官方的std :: string類的一些差異,從我貼:

  • 字符串的長度通常是作爲一個成員變量,所以您不必不斷的打電話的strlen找到長度。
  • std :: string類使用模板,所以你不限於char類型。如果您使用的是Unicode,則可以使用std :: wstring,它使用16位或32位字符串,並將char類型替換爲wchar_t類型。
  • 通常有很多優化可供選擇。最近最受歡迎的是「短串」優化。

一旦你對C++比較適應,你應該嘗試編寫你自己的字符串類。這不是你在實踐中會用到的東西,但這對於圖書館寫作來說是一個很好的練習。

+0

非常感謝您......這正是我想弄明白的。我想我會讓它變得更加複雜,然後我實際上不得不這樣做。 –

+1

+1,這是一個很好的答案。只需使用'delete []'作爲字符數組。 – iammilind

+0

糟糕!感謝您的支持。這很少見,我現在不得不處理手動內存分配。 –

3

通過編寫一個封裝了大量字符串函數的類,並重載了一堆運算符。

串真的是就像任何其他類:

string s = "hello" 

是定義了equals操作者的過載:

string& operator= (const char* s); 

例如。

0

這只是一個名爲「串」一類,像這樣:

class string 
{ 
private: 
    //members 
    char* c; 
public: 
    //methods 
    bool operator==(const string& other) const; 
}; 
相關問題