文字列データ管理

Visual C++ には、文字列データの管理方法がいくつか用意されています。

  • C スタイルの NULL 終端文字列を操作する文字列操作

  • 文字列を管理するための Win32 API 関数

  • MFC のクラス CStringT クラス。柔軟でサイズ変更可能な文字列オブジェクトを提供します

  • クラス CStringT クラスCString と同じ機能を持つ MFC に依存しない文字列オブジェクトを提供します

ほぼすべてのプログラムによって、文字列データが処理されます。 MFC の CString クラスは、多くの場合、柔軟な文字列処理に最適なソリューションです。 バージョン 7.0 以降、CString は MFC または MFC に依存しないプログラムで使用できます。 Unicode または MBCS プログラミングのように、実行時ライブラリと CString はどちらもマルチバイト (ワイド) 文字を含む文字列をサポートします。

この記事では、クラス ライブラリが文字列操作に関連して提供する汎用サービスについて説明します。 この記事では、次のトピックについて説明します。

CStringT クラス クラスは、文字列の操作をサポートします。 これは、C 実行時ライブラリ文字列パッケージによって通常提供される機能を置き換え、拡張することを目的としています。 CString クラスは、Basic にあるものと同様に、文字列処理を簡略化するためのメンバー関数と演算子を提供します。 このクラスには、CString と標準の C++ 文字列データ型を構築、割り当て、比較するためのコンストラクターと演算子も用意されています。 CStringCObject から派生していないため、ほとんどの Microsoft Foundation Class ライブラリ (MFC) に依存しない CString オブジェクトを使用できます。

CString オブジェクトは "値セマンティクス" に従います。CString オブジェクトは一意の値を表します。 CString は、文字列へのポインターとしてではなく、実際の文字列と考える必要があります。

CString オブジェクトは、可変文字数のシーケンスを表します。 CString オブジェクトは、文字の配列と考えることができます。

Unicode と MBCS が提供する移植性

MFC バージョン 3.0 以降では、CString を含む MFC が Unicode 文字セットとマルチバイト文字セット (MBCS) の両方で有効になります。 このサポートにより、Unicode 文字または ANSI 文字用にビルドできる移植可能なアプリケーションを簡単に作成できます。 この移植性を有効にするには、CString オブジェクト内の各文字の型は TCHAR です。これは、アプリケーションのビルド時にシンボル __UNICODE を定義した場合は wchar_t、定義していない場合は char として定義されます。 wchar_t 文字の幅は 16 ビットです。 _MBCS シンボルを定義してビルドすると、MBCS が有効になります。 MFC 自体は、__MBCS シンボル (NAFX ライブラリの場合) または __UNICODE シンボル (UAFX ライブラリの場合) のいずれかを定義してビルドされます。

Note

この CString の例と文字列に関する付属の記事の例では、リテラル文字列を次の形式に変換する _T マクロを使用して、Unicode 移植性のために適切に書式設定されたリテラル文字列を示しています。

L"literal string"

Note

コンパイラによって Unicode 文字列として扱われます。 コード例を次に示します。

CString strName = _T("Name");   

Note

_UNICODE が定義されている場合は、Unicode 文字列として変換されます。定義されていない場合は、ANSI 文字列として変換されます。 詳細については、「Unicode とマルチバイト文字セット (MBCS) のサポート」を参照してください。

CString オブジェクトには、最大 INT_MAX (2,147,483,647) 文字を格納できます。 TCHAR データ型は、CString オブジェクト内の個々の文字を取得または設定するために使用されます。 文字配列とは異なり、CString クラスにはメモリ割り当て機能が組み込まれています。 これにより、必要に応じて CString オブジェクトを自動的に拡張できます (つまり、長い文字列に合わせて CString オブジェクトを拡張する必要はありません)。

CStrings および const char ポインター

CString オブジェクトは、リテラル C スタイルの文字列 (Unicode の下にない場合は const char* と同じ PCXSTR) のようにも機能できます。 CSimpleStringT::operator PCXSTR 変換演算子を使用すると、関数呼び出しの文字ポインターに CString オブジェクトを自由に置き換えることができます。 CString(LPCWSTR pszSrc) コンストラクターを使用すると、文字ポインターを CString オブジェクトに置き換えることができます。

CString を折りたたむ試行は行われません。 たとえば、Chicago を含む 2 つの CString オブジェクトを作成すると、Chicago の文字は 2 か所に格納されます。 (これは将来のバージョンの MFC には当てはまらない場合があります。これに依存しないようにする必要があります)

Note

文字への非定数ポインターとして CString に直接アクセスする必要がある場合は、CSimpleStringT::GetBuffer メンバー関数および CSimpleStringT::ReleaseBuffer メンバー関数を使用します。

Note

Automation で使用される BSTR オブジェクト (旧称 OLE オートメーション) を割り当て、設定するには、CStringT::AllocSysString メンバー関数および CStringT::SetSysString メンバー関数を使用します。

Note

可能であれば、ヒープではなく、フレームに CString オブジェクトを割り当てます。 これにより、メモリが節約され、パラメーターの受け渡しが簡略化されます。

CString クラスは Microsoft Foundation Class ライブラリ コレクション クラスとして実装されていませんが、CString オブジェクトはコレクション内の要素として格納できます。

CString 参照カウント

MFC バージョン 4.0 以降、CStringT クラス オブジェクトがコピーされると、MFC はデータをコピーするのではなく参照カウントをインクリメントします。 これにより、パラメーターが値渡しで渡され、値渡しで CString オブジェクトを返す方がより効率的になります。 これらの操作により、コピー コンストラクターが場合によっては複数回呼び出されます。 参照カウントをインクリメントして、これらの一般的な操作のオーバーヘッドを削減し、CString の使用をより魅力的なオプションにします。

各コピーが破棄されると、元のオブジェクトの参照カウントがデクリメントされます。 元の CString オブジェクトは、参照カウントが 0 に減るまで破棄されません。

CString メンバー関数 CSimpleStringT::LockBuffer および CSimpleStringT::UnlockBuffer を使用して、参照カウントを有効/無効にできます。

関連項目

MFC の一般的なトピック