2013-01-23 67 views
12

CStringsを別の方法で宣言したコードが表示されるのはなぜですか。`CString`とは何ですか?

いくつかの使用この形式

char a_c_string []; 

他の人が

CString another_c_string; 

を使用している間は、違いはありますか?私が最初の例で行ったように、私がCStringsで見つけたすべての参考文献は、フォーラムや他の人が例を挙げているところで他のやり方をしたことしか見ていません。

+0

CStringはMicrosoftの嫌悪感です、いいえ? –

+12

いいえ、忌まわしいことではなく、過去数千ものプログラムの作成に役立っています。申し訳ありませんが根拠のないMS-bashingは理論的根拠や選択肢がなく、不自由です。 –

+0

'CString'はこれまで使用していた言語では存在しません。それはどこから来たの? CまたはC++のいずれかを選択して(そのようにタグ付けしてください)、CStringがどの言語にあるかを教えてください。 –

答えて

19

CStringマイクロソフトの実装は、CやC++のタイプでもないです。本質的に代替されIt appears to be a Microsoft inventionstd::stringに:

  • CStringオブジェクトは、連結操作の結果として成長することができます。
  • CStringオブジェクトは、「value semantics」に従います。 CStringオブジェクトを文字列へのポインタとしてではなく、実際の文字列と考えてください。
  • const char*LPCTSTR関数の引数の代わりにCStringオブジェクトを自由に代用できます。
  • 変換演算子は、文字列の文字に読み取り専用の文字配列(Cスタイルの文字列)として直接アクセスします。

ように私は、それを無視してお勧めします。(a)は、人々はあなたが話しているか知っている


(b)あなたのコードは移植性があります。
(c)多くの人が多くを費やしている世界的に受け入れられているISO C++標準に従って、誰もが合理化できるC++を書いています。この明示的な目的については何時間も議論しています(y'know、 の部屋にある会社のオフィス)。

Microsoft Visual C++でプログラミングしている場合にのみ使用できますが、これは実質的に制限されています。

+2

正の面では、 'std :: string'は' const char * '/' LPCSTLSKJ'への変換を除いて、これらすべてを行います。単に 'my_str.c_str()'を呼び出します。 – Potatoswatter

+0

@Potatoswatter:そして、実際にはこれが暗黙的ではない_good_ものです。](http://stackoverflow.com/questions/492061/why-doesnt-stdstring-provide-implicit-conversion-to-char)しかし、マイクロソフトがこのコンベンションを打ち切ることに決めたことは驚きではありません。それはむしろ彼らのMO、INITです。 –

+0

私はLinuxを実行しているだけでVisual C++にはアクセスできないのでほとんど役に立ちませんが、C/C++での文字列処理とcstringとstringオブジェクトの使用のメリットを研究している間に、 。返信ありがとうございました – user1768079

0

CStringは、Visual C++で使用されます。

のVisual C++は、C++

+0

C++の実装はC++の実装です。つまり、ランダムな余分な記号が含まれていないことを意味します。 'CString'は、もしそれがあなたの提案であれば、Microsoft _extension to_ C++です。 –

+0

@ Non-StopTimeTravel:これは拡張子ではなく、追加のクラスです。 –

+0

@JerryCoffin:そして区別は.....ですか? –

7

混乱の原因です: "CString"の "C"は、MFCのすべてのクラスが持つ接頭辞です。 MFCは、Microsoftがwin32 APIをラップするC++ライブラリです。この文字列クラスは、C言語が提供する文字列処理機能を記述するために使用される「C文字列」とはほとんど関係がありません。 C言語は、文字列を表すchar配列へのポインタを操作する文字列処理関数のみを提供し、最後の文字はNUL(別名NUL終端またはゼロ終端)である必要があります。 C++自体も文字列クラスstd::string(実際にはstd :: wstringとstd :: basic_stringテンプレートもありますが、初心者であれば無視しても問題ありません)に注意してください。

17

多くのGUIフレームワークには、独自の文字列クラスがあります。例: QTはQString、wxWindowsはwxStringです。この場合、MFCにはCStringがあります。 MFC guiコードのコンテキストでは、CStringを使用するのが便利ですし、Visual C++に依存しているため、コードの移植性が想定されないためです。私はそれが非標準的なので、それを無視することを言ってブランケットステートメントに注意する - それはすべてのコンテキストに依存します。

+1

"CString"の "C"は "Class"の略です。 –

関連する問題