文字列データ管理

更新 : 2007 年 11 月

Visual C++ では、文字列データを管理する以下の方法を提供しています。

  • C スタイルの null で終わる文字列を扱う文字列操作 (CRT)

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

  • 柔軟でサイズを変更できる文字列オブジェクトを提供する MFC の CStringT クラス

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

文字列データは、ほとんどすべてのプログラムで取り扱われます。MFC の CString クラスは、ほとんどの場合に柔軟な文字列処理を提供できる最適のソリューションと言えます。バージョン 7.0 以降では、CString は MFC プログラムでも MFC に依存しないプログラムでも使用できます。Unicode や MBCS プログラミングと同様に、ランタイム ライブラリも CString もマルチバイト (ワイド) 文字を含む文字列をサポートします。

ここでは MFC (Microsoft Foundation Class) ライブラリの文字列操作に関連する汎用的な機能について説明します。ここでは、次のトピックについて説明します。

  • Unicode と MBCS が提供する移植性

  • CString と const char 型へのポインタ

  • CString への参照のカウント

CStringT クラス には文字列操作機能が用意されています。この機能は C ランタイム ライブラリの文字列パッケージで通常提供される機能を代替または拡張するものです。CString クラスには、Basic と同等の文字列操作機能 (メンバ関数および演算子) が用意されています。CString オブジェクト構築用のコンストラクタ、および標準 C++ 文字列データ型との間の代入、比較を行うための演算子が用意されています。CString クラスは CObject の派生クラスではないため、MFC のほとんどの大部分からは独立して動作します。

CString オブジェクトは値に基づいて操作が決定されます。CString の各オブジェクトは一意な値を持ちます。CString は文字列へのポインタではなく、文字列自体として扱うことができます。

CString オブジェクトに含まれる文字数は可変です。CString オブジェクトは文字の配列と考えることができます。

Unicode と MBCS が提供する移植性

MFC Version 3.0 以降では、CString を含む MFC 全体で Unicode とマルチバイト文字セット (MBCS: Multibyte Character Sets) の両方を扱うことができます。したがって、Unicode 文字用にも ANSI 文字用にもビルドできる移植性の高いアプリケーションを作成できます。この移植性を実現するには、CString オブジェクト内の各文字を TCHAR 型にする必要があります。TCHAR 型はビルド時にシンボル _UNICODE を定義すると wchar_t 型に、定義しないと char 型になります。wchar_t 文字は 16 ビットです。MBCS を使用するときは、ビルド時にシンボル _MBCS を定義します。MFC 自体は、_MBCS シンボル (NAFX ライブラリ) または、_UNICODE シンボル (UAFX ライブラリ) でビルドします。

8a994dfk.alert_note(ja-jp,VS.90).gifメモ :

このトピックおよび関連するトピックで使用する CString の例はすべて _T マクロを使用して書式化した Unicode 用に移植できるリテラル文字列です。リテラル文字列は次のように変換されます。

L"literal string"

8a994dfk.alert_note(ja-jp,VS.90).gifメモ :

コンパイラはこの文字列を Unicode 文字列として扱います。たとえば次のようなコードがあるとします。

CString strName = _T("Name");   
8a994dfk.alert_note(ja-jp,VS.90).gifメモ :

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

CString オブジェクトには最大 INT_MAX (2,147,483,647) 文字まで格納できます。CString オブジェクト内の文字を読み書きするときは TCHAR 型のデータが使用されます。文字配列とは異なり、CString クラスにはメモリ割り当て機能が組み込まれています。したがって、CString オブジェクトのサイズは必要に応じて増加します。文字列が長くなっても、CString オブジェクトのメモリ サイズを心配する必要はありません。

CString と const char 型へのポインタ

CString は C スタイルの文字列としても扱うことができます。この文字列は PCXSTR 型です。これは Unicode を使用していない場合、const char* と同じです。変換演算子 CSimpleStringT::operator PCXSTR は、関数呼び出しの中の CString を文字へのポインタに変換します。コンストラクタ CString( LPCWSTRpszSrc**)** は文字へのポインタを CString オブジェクトに変換します。

複数の CString が同じ実体を指すことはありません。たとえば Chicago という文字列を含む CString オブジェクトを 2 つ作成すると、文字列 Chicago はメモリ内の 2 か所に個別に保存されます。ただし、MFC の将来のバージョンでは異なることもあるため、この実装に依存しないでください。

8a994dfk.alert_note(ja-jp,VS.90).gifメモ :

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

8a994dfk.alert_note(ja-jp,VS.90).gifメモ :

オートメーション (以前の名称は OLE オートメーション) で使用する BSTR オブジェクトの割り当てと設定には、CStringT::AllocSysStringCStringT::SetSysString の各メンバ関数を使用します。

8a994dfk.alert_note(ja-jp,VS.90).gifメモ :

可能な限り、CString オブジェクトはヒープ上ではなくスタック フレーム上に割り当ててください。メモリが節約され、パラメータの受け渡しも簡単になります。

CString クラスは MFC コレクション クラスではありません。ただし、CString オブジェクトはコレクションの要素として保存できます。

CString への参照のカウント

MFC バージョン 4.0 で CStringT クラス オブジェクトをコピーする場合、MFC はデータをコピーせずに参照カウントをインクリメントします。この結果、値でパラメータを引き渡し、値で CString オブジェクトを返す効率が向上します。このような操作はコピー コンストラクタを何回も呼び出します。しかし、参照カウントをインクリメントすると、このような共通的な操作のオーバーヘッドが減るため、CString も抵抗なく使用できます。

コピーが破棄されるごとに、元のオブジェクトの参照カウントもデクリメントされます。参照カウントがゼロになると、元の CString オブジェクトが破棄されます。

参照カウントの無効化および有効化には、CStringCSimpleStringT::LockBuffer メンバ関数と CSimpleStringT::UnlockBuffer メンバ関数を使用します。

参照

概念

MFC の一般的なトピック