CString(MFC/ATL 框架)和 QString(Qt 框架)是 C++ 开发中常用的字符串类,分别适用于不同的开发环境。它们在功能设计上有很多相似之处,但也存在框架特性带来的差异。以下是两者常用功能的对比:
一、基础操作对比
功能 |
CString(MFC) |
QString(Qt) |
说明 |
初始化 |
CString str = "hello";CString str(_T("hello")); |
QString str = "hello";QString str("hello"); |
CString 需考虑 Unicode(_T 宏),QString 默认 Unicode |
长度 |
int len = str.GetLength(); |
int len = str.length(); |
均返回字符数(非字节数) |
判空 |
if (str.IsEmpty()) |
if (str.isEmpty()) |
空字符串判断 |
清空 |
str.Empty(); |
str.clear(); |
清空字符串内容 |
赋值 |
str = "new value"; |
str = "new value"; |
直接赋值 |
拼接 |
str += "append";str = str1 + str2; |
str += "append";str = str1 + str2; |
运算符重载一致 |
比较 |
if (str1 == str2)str.Compare(str2)(返回 0 表示相等) |
if (str1 == str2)str1.compare(str2)(返回 0 表示相等) |
Compare 均区分大小写 |
大小写转换 |
str.MakeUpper();str.MakeLower(); |
str = str.toUpper();str = str.toLower(); |
CString 是原地修改,QString 返回新对象 |
子串提取 |
str.Mid(start, length)(从 start 取 length 个字符) |
str.mid(start, length) |
参数和行为一致 |
前缀 / 后缀判断 |
str.Left(length)(取左侧 length 字符)str.Right(length)(取右侧 length 字符) |
str.left(length)str.right(length) |
功能完全对应 |
二、字符串查找与替换
功能 |
CString(MFC) |
QString(Qt) |
说明 |
查找子串 |
int pos = str.Find("sub");(返回索引,-1 表示未找到) |
int pos = str.indexOf("sub"); |
基础查找功能一致 |
反向查找 |
int pos = str.ReverseFind('c');(仅单个字符) |
int pos = str.lastIndexOf("sub");(支持子串) |
QString 功能更灵活 |
替换子串 |
str.Replace("old", "new"); |
str.replace("old", "new"); |
均支持全局替换 |
是否包含子串 |
bool has = str.Find("sub") != -1; |
bool has = str.contains("sub"); |
QString 有专门的 contains 方法 |
三、数值转换
功能 |
CString(MFC) |
QString(Qt) |
说明 |
字符串转整数 |
int num = _ttoi(str); |
int num = str.toInt(); |
QString 可指定进制(如 str.toInt (nullptr, 16) 转十六进制) |
字符串转浮点数 |
double num = _tcstod(str, nullptr); |
double num = str.toDouble(); |
CString 依赖 C 库函数,QString 有原生方法 |
整数转字符串 |
CString str; str.Format(_T("%d"), 123); |
QString str = QString::number(123); |
QString 格式更简洁,支持进制参数 |
浮点数转字符串 |
str.Format(_T("%.2f"), 3.14); |
str = QString::asprintf("%.2f", 3.14); 或 str = QString("%1").arg(3.14, 0, 'f', 2); |
Qt 的 arg () 方法更安全灵活 |
四、编码转换
功能 |
CString(MFC) |
QString(Qt) |
说明 |
Unicode 转 ANSI |
CStringA ansiStr = CStringA(str); |
QByteArray ansi = str.toLocal8Bit(); |
转为本地编码(通常是 GBK 或 UTF-8) |
转 UTF-8 |
CStringA utf8Str = CW2A(str, CP_UTF8);(需 ATL 转换宏) |
QByteArray utf8 = str.toUtf8(); |
QString 原生支持,更简洁 |
ANSI 转 Unicode |
CStringW unicodeStr = CA2W(ansiStr, CP_ACP); |
QString str = QString::fromLocal8Bit(ansi); |
从本地编码解析字符串 |
从 UTF-8 构造 |
CStringW str = CA2W(utf8Str, CP_UTF8); |
QString str = QString::fromUtf8(utf8); |
直接从 UTF-8 字节数组构造 |
五、其他特色功能
功能 |
CString(MFC) |
QString(Qt) |
说明 |
格式化字符串 |
str.Format(_T("Name: %s, Age: %d"), name, age); |
str = QString("Name: %1, Age: %2").arg(name).arg(age); |
Qt 的 arg () 支持参数重排(如 %2 先于 %1),更安全 |
修剪空白字符 |
str.Trim();(去除首尾空格)str.TrimLeft();/TrimRight() |
str = str.trimmed();(去除首尾空白)str = str.trimLeft();/trimRight() |
功能类似,QString 支持更多空白字符(如制表符) |
分割字符串 |
/ |
QStringList list = str.split(';'); |
QStringList 比 CStringArray 功能更丰富 |
正则表达式 |
无原生支持(需借助 C 库或第三方库) |
QRegExp rx("pattern");bool match = rx.exactMatch(str); |
Qt 内置正则支持,功能强大 |
国际化支持 |
需结合 MFC 资源 DLL |
与 Qt Linguist 无缝集成,支持 .qm 翻译文件 |
Qt 国际化更便捷,是框架核心特性之一 |
六、核心差异总结
- 编码处理:
-
- CString 分 CStringA(ANSI)和 CStringW(Unicode),需显式处理编码转换(依赖宏或 ATL 转换类)。
-
- QString 内部始终使用 Unicode(UTF-16),编码转换通过 toUtf8()、fromLocal8Bit() 等方法轻松实现,无需关注底层细节。
- 框架依赖:
-
- CString 是 MFC/ATL 的一部分,仅在 Windows 平台有效,与 MFC 控件(如 CEdit)交互更自然。
-
- QString 是 Qt 框架的核心类,跨平台(Windows/Linux/macOS),与 Qt 控件(如 QLineEdit)无缝对接。
- 功能设计:
-
- CString 设计简洁,适合轻量字符串操作,依赖 Windows API 扩展功能。
-
- QString 功能更全面(内置正则、国际化、安全格式化),面向现代 C++ 开发,避免原始指针操作。
- 内存管理:
-
- 两者均自动管理内存(无需手动释放),但 QString 采用写时复制(Copy-On-Write)优化,效率更高。
根据开发场景选择:Windows 平台的 MFC 项目优先用 CString,跨平台或 Qt 项目必须用 QString。两者在基础字符串操作上逻辑相似,迁移时主要注意编码转换和框架特有功能的差异。