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")));