字符串数据管理
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
,否则定义为 char
。 wchar_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
对象以适应更长的字符串)。
CStrings
和 const char
指针
CString
对象也可以用作文本 C 样式字符串(一个 PCXSTR
,如果不在 Unicode 下,则它与 const char*
相同)。 CSimpleStringT::operator PCXSTR
转换运算符允许用 CString
对象自由替换函数调用中的字符指针。 CString(LPCWSTR pszSrc)
构造函数允许用字符指针替换 CString
对象。
不会尝试折叠 CString
对象。 例如,如果创建两个包含 Chicago
的 CString
对象,则 Chicago
中的字符将存储在两个位置。 (在将来的 MFC 版本中可能不是如此,因此请不要依赖这种方式。)
注意
需要直接访问用作指向字符的非常量指针的 CString
时,请使用 CSimpleStringT::GetBuffer
和 CSimpleStringT::ReleaseBuffer
成员函数。
注意
使用 CStringT::AllocSysString
和 CStringT::SetSysString
成员函数分配和设置自动化(以前称为 OLE 自动化)中使用的 BSTR
对象。
注意
在可能的情况下,请在框架而不是堆上分配 CString
对象。 这可以节省内存并简化参数传递。
CString
类未实现为 Microsoft 基础类库集合类,不过 CString
对象肯定可以存储为集合中的元素。
CString
引用计数
从 MFC 4.0 版开始,复制 CStringT
类对象时,MFC 会递增引用计数而不是复制数据。 这样就提高了按值传递参数和按值返回 CString
对象的效率。 这些操作会导致调用复制构造函数,有时会调用多次。 递增引用计数可以降低这些常见操作的开销,并使得 CString
成了更有吸引力的选项。
随着每个副本的销毁,原始对象中的引用计数会不断递减。 原始 CString
对象在其引用计数减至零之前不会销毁。
可以使用 CString
成员函数 CSimpleStringT::LockBuffer
和 CSimpleStringT::UnlockBuffer
来禁用或启用引用计数。