4

次の方法で文字列の配列を使用するコードを見てきました。

string *pointer = new string[runtimeAmmount];

次のようにアクセスされる文字列内の個々の文字も確認しました。

string aString = "this";
char bString[] = "that";
bString[3] = aString[3];

上記の結果は、「thas」に等しい bString になります。これは、文字列が実際には最初の文字の位置へのポインターであることを示唆しています。ただし、文字列には「string.c_str()」としてアクセスされるメンバー関数がまだあります。これは、オブジェクトとしてそれ自体がポインターの規則に従わないことを意味します。これはどのように機能しますか?

注:私の最初の質問は異なるはずでしたが、入力して理解しました。確認のためだけに、誰かが私の元の質問にまだ答えていただければ幸いです。私の最初の質問は次のとおりです。各文字列の長さがその寿命を通じて変化する可能性がある場合、文字列の配列をどのように新しくすることができますか? 弦同士がぶつかりませんか?

私が思いついた答えは次のとおりです。文字列には何らかの方法で C スタイルの配列へのポインターが含まれているため、オブジェクトは一定量のスペースを占有します。

また

文字列は、STL テンプレートの一種であり、まだ実際に調べていません。

4

3 に答える 3

8

質問の 4 行のコードのそれぞれで何が起こっているのかを説明しますが、最初に、あなたの結論は正確ではないと言わなければなりません。stringクラスに組み込まれている演算子のオーバーロードによって「だまされています」 。内部では、stringクラスは C スタイルの文字配列を保持している可能性がありますが、これはカプセル化stringされており、C スタイルの文字列とは異なり、不透明なオブジェクトとして扱われるべきです。

次に、各行について:

string *pointer = new string[runtimeAmmount];

この行では、新しく割り当てられた (空の)オブジェクトpointerの配列を指すように設定されています。 C スタイルの文字列の文字数ではなく、配列内の文字列の数です。string runtimeAmmount

string aString = "this";

この行は、クラスの (非明示的な) 変換コンストラクターを使用して、新しい空の文字列を作成しますstring: string(const char *). ( などの非構築コンテキストでは、クラスaString = "this";operator=(const char *)オーバーロードが使用されることに注意してください。)string

char bString[] = "that";

これは、文字の配列として扱われる典型的な C 文字列です。

bString[3] = aString[3];

これはoperator[]stringクラスのオーバーロードを使用して文字 (参照) を返し、それを C スタイルの文字配列の 3 番目の文字スポットに割り当てます。

これが役立つことを願っています。

于 2012-07-03T01:50:57.870 に答える
4

これを行う場合:

string *pointer = new string[runtimeAmmount];

オブジェクトの配列を作成していstringます。それぞれはコンストラクターで構築されstring::string、必要なことは何でも実行できます。この場合、stringコンストラクタで初期化されるメモリへのポインタがあります。したがって、配列は char* ポインターの配列のようなもので、それぞれが個別に割り当てられます。

于 2012-07-03T01:52:08.733 に答える
3

あなたの直感は正しいです。

C++ の文字列はオブジェクトであり、他のストレージへのポインターを含めることができます。(その必要はありません。理由を確認したい場合は、Google で「小さな文字列の最適化」を検索してください。しかし、それは気晴らしです。)

文字列を次のような構造体と考えると:

struct str {
   int len; // number of bytes allocated
   char *data; // pointer to the data
};

次に、文字列がどのように機能するかを確認できます。std::string は実際にはこれよりもはるかに複雑であることに注意してください。しかし、これでアイデアが伝わるはずです。

テンプレートに関しては、 に特化しstd::stringた のインスタンス化です( に特化した とは対照的に)std::basic_stringcharstd::wstringwchar_t

于 2012-07-03T01:50:40.367 に答える