2011-07-26 10 views
0

「文字列」型はC++でどのように作成されましたか? Cでは、文字列は文字配列ですが、C++ではどのように文字配列をC++で「文字列」に変換しましたか?C++での文字列型の作成方法は?

+0

あなたは歴史的な詳細を意味しましたか?さもなければ@Daveの答えは正しい。 – 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を使用している場合は、char型をwchar_t型に置き換えて、16ビットまたは32ビットの文字列を使用するstd :: wstringを使用できます。
  • 通常、多くの最適化を選択できます。最近、最も人気のあるものは「短い文字列」の最適化です。

C++に比較的慣れたら、独自の文字列クラスを作成してください。あなたが実際に使用するものではありませんが、図書館執筆には本当に良い演習です。それは、文字列 'という名前だけのクラスです

+0

ありがとうございました...これは私が理解しようとしていたものです。私は実際にはもっと複雑にしていたと思う。 –

+1

+1、それは良い答えです。文字配列に 'delete []'を使うだけです。 – iammilind

+0

おっと!それをキャッチするためにありがとう。最近は、手動でメモリを割り当てる必要があります。 –

3

多くの文字列関数をカプセル化したクラスを作成し、多数の演算子をオーバーロードすることによって、

string s = "hello" 

が定義された等号演算子のオーバーロードである:例えば

string& operator= (const char* s); 

文字列が本当に他のどのような単なるクラスです。

0

、このような何か:

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