文字列データ管理
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++ 文字列データ型を構築、割り当て、比較するためのコンストラクターと演算子も用意されています。 CString
は CObject
から派生していないため、ほとんどの 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
を使用して、参照カウントを有効/無効にできます。