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

另请参阅

字符串 (ATL-MFC)