字符串数据管理

Visual C++ 提供了多种用于管理字符串数据的方式:

  • 字符串操作可用于处理 C 样式的 NULL 结尾字符串

  • 用于管理字符串的 Win32 API 函数

  • MFC 的 CStringT,提供灵活、可调整大小的字符串对象

  • CStringT,提供与 CString 功能相同的、与 MFC 无关的字符串对象

几乎所有程序都使用字符串数据。 MFC 的 CString 类通常是用于灵活处理字符串的最佳解决方案。 从版本 7.0 开始,CString 可以在 MFC 程序或与 MFC 无关的程序中使用。 与在 Unicode 或 MBCS 编程中一样,运行时库和 CString 都支持包含多字节(宽)字符的字符串。

本文介绍类库提供的与字符串操作相关的通用服务。 本文涉及的主题包括:

CStringT提供操作字符串的支持。 它旨在取代和扩展 C 运行时库字符串包通常提供的功能。 CString 类提供用于简化字符串处理的成员函数和运算符,类似于 Basic 中的成员函数和运算符。 该类还提供用于构造、分配和比较 CString 及标准 C++ 字符串数据类型的构造函数和运算符。 由于 CString 不是从 CObject 派生的,因此你可以独立于大多数 Microsoft 基础类库 (MFC) 使用 CString 对象。

CString 对象遵循“值语义”。CString 对象表示唯一值。 可将 CString 视为实际字符串,而不是指向字符串的指针。

CString 对象表示由可变数量的字符构成的序列。 可将 CString 对象视为字符数组。

Unicode 和 MBCS 提供可移植性

在 MFC 3.0 版和更高版本中,为 Unicode 和多字节字符集 (MBCS) 启用了 MFC(包括 CString)。 借助此项支持,能够更轻松地编写可为 Unicode 或 ANSI 字符生成的可移植应用程序。 为实现这种可移植性,CString 对象中的每个字符均为 TCHAR 类型。如果在生成应用程序时定义了符号 _UNICODE,则该类型将定义为 wchar_t,否则定义为 charwchar_t 字符是 16 位宽字符。 如果使用定义的符号 _MBCS 生成,则启用 MBCS。 MFC 本身是使用定义的 _MBCS 符号(对于 NAFX 库)或 _UNICODE 符号(对于 UAFX 库)生成的。

注意

本文中的 CString 示例和随附的有关字符串的文章介绍了如何使用 _T 宏正确设置文本字符串的格式,以实现 Unicode 可移植性。该宏将文本字符串转换为以下形式:

L"literal string"

注意

编译器将其视为 Unicode 字符串。 例如,以下代码:

CString strName = _T("Name");   

注意

如果定义了 _UNICODE,则转换为 Unicode 字符串,否则转换为 ANSI 字符串。 有关详细信息,请参阅 Unicode 和多字节字符集 (MBCS) 支持一文。

CString 对象最多可以存储 INT_MAX (2,147,483,647) 个字符。 TCHAR 数据类型用于获取或设置 CString 对象中的各个字符。 与字符数组不同,CString 类具有内置的内存分配功能。 这样,CString 对象就可以根据需要自动扩大(即,你无需考虑如何扩大 CString 对象以适应更长的字符串)。

CStringsconst char 指针

CString 对象也可以用作文本 C 样式字符串(一个 PCXSTR,如果不在 Unicode 下,则它与 const char* 相同)。 CSimpleStringT::operator PCXSTR 转换运算符允许用 CString 对象自由替换函数调用中的字符指针。 CString(LPCWSTR pszSrc) 构造函数允许用字符指针替换 CString 对象。

不会尝试折叠 CString 对象。 例如,如果创建两个包含 ChicagoCString 对象,则 Chicago 中的字符将存储在两个位置。 (在将来的 MFC 版本中可能不是如此,因此请不要依赖这种方式。)

注意

需要直接访问用作指向字符的非常量指针的 CString 时,请使用 CSimpleStringT::GetBufferCSimpleStringT::ReleaseBuffer 成员函数。

注意

使用 CStringT::AllocSysStringCStringT::SetSysString 成员函数分配和设置自动化(以前称为 OLE 自动化)中使用的 BSTR 对象。

注意

在可能的情况下,请在框架而不是堆上分配 CString 对象。 这可以节省内存并简化参数传递。

CString 类未实现为 Microsoft 基础类库集合类,不过 CString 对象肯定可以存储为集合中的元素。

CString 引用计数

从 MFC 4.0 版开始,复制 CStringT对象时,MFC 会递增引用计数而不是复制数据。 这样就提高了按值传递参数和按值返回 CString 对象的效率。 这些操作会导致调用复制构造函数,有时会调用多次。 递增引用计数可以降低这些常见操作的开销,并使得 CString 成了更有吸引力的选项。

随着每个副本的销毁,原始对象中的引用计数会不断递减。 原始 CString 对象在其引用计数减至零之前不会销毁。

可以使用 CString 成员函数 CSimpleStringT::LockBufferCSimpleStringT::UnlockBuffer 来禁用或启用引用计数。

另请参阅

常规 MFC 主题