CString 引数の渡し方
ここでは CString オブジェクトを関数の引数や戻り値として利用する方法について説明します。CString
CString の引数渡し規約
クラスのインターフェイスを定義するときは、メンバー関数の引数渡し規約を決める必要があります。 CString オブジェクトを関数の引数または戻り値として使用する場合はいくつかの標準的な規則があります。 これらの規則 (「関数入力として文字列を利用する場合」と「関数出力として文字列を利用する場合」を参照) に従うと、コードが効率的で正確になります。
関数入力として文字列を利用する場合
呼び出される関数の中で CString オブジェクトを最も効率的かつ安全に使用する方法は、関数に CString オブジェクトを渡すことです。 名前に反して、CString オブジェクトは、null 終端文字がある C スタイルの文字列として文字列を内部的に格納しません。 代わりに、CString オブジェクトは、文字列の文字数を追跡します。 CString を使用して null で終わる文字列への LPCTSTR ポインターを設定することは小さな操作ですが、コード内でその操作を常に実行する必要がある場合はたいへんな作業になる可能性があります。 CString の内容を変更すると LPCTSTR ポインターの古いコピーが無効になるので、結果は一時的なものです。
C スタイルの文字列を指定することに意味がある場合があります。 たとえば、呼び出される関数が C で記述され、オブジェクトをサポートしていない状況が考えられます。 この場合は、CString パラメーターを LPCTSTR に強制的に変換すると、関数で C スタイルの null で終わる文字列が取得されます。 さらに、C スタイルの文字列パラメーターを指定できる CString コンストラクターを使用して CString オブジェクトを作成する方法もあります。
関数の中で文字列の値を変更する場合は、パラメーターとして非定数 CString 型への参照 (CString&) を宣言します。
関数出力として文字列を利用する場合
通常は、CString オブジェクトはプリミティブ型同様の値セマンティクスに従うため、関数から CString オブジェクトを返すことができます。 読み取り専用文字列を戻り値にするときは、定数 CString 型への参照 (const CString&) として宣言します。 次の例では、CString オブジェクトをパラメーターと戻り値の両方として使用しています。
class CName : public CObject
{
private:
CString m_firstName;
TCHAR m_middleInit;
CString m_lastName;
public:
CName() {}
void SetData(LPCTSTR fn, const TCHAR mi, LPCTSTR ln)
{
m_firstName = fn;
m_middleInit = mi;
m_lastName = ln;
}
void GetData(CString& cfn, TCHAR& mi, CString& cln)
{
cfn = m_firstName;
mi = m_middleInit;
cln = m_lastName;
}
CString GetLastName()
{
return m_lastName;
}
};
CName name;
CString last, first;
TCHAR middle;
name.SetData(_T("John"), 'Q', _T("Public"));
ASSERT(name.GetLastName() == _T("Public"));
name.GetData(first, middle, last);
ASSERT((first == _T("John")) && (last == _T("Public")));