本文说明如何将 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")));