CString(MFC/ATL 框架)和 QString(Qt 框架)

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 国际化更便捷,是框架核心特性之一 |

六、核心差异总结

  1. 编码处理
    • CString 分 CStringA(ANSI)和 CStringW(Unicode),需显式处理编码转换(依赖宏或 ATL 转换类)。
    • QString 内部始终使用 Unicode(UTF-16),编码转换通过 toUtf8()、fromLocal8Bit() 等方法轻松实现,无需关注底层细节。
  1. 框架依赖
    • CString 是 MFC/ATL 的一部分,仅在 Windows 平台有效,与 MFC 控件(如 CEdit)交互更自然。
    • QString 是 Qt 框架的核心类,跨平台(Windows/Linux/macOS),与 Qt 控件(如 QLineEdit)无缝对接。
  1. 功能设计
    • CString 设计简洁,适合轻量字符串操作,依赖 Windows API 扩展功能。
    • QString 功能更全面(内置正则、国际化、安全格式化),面向现代 C++ 开发,避免原始指针操作。
  1. 内存管理
    • 两者均自动管理内存(无需手动释放),但 QString 采用写时复制(Copy-On-Write)优化,效率更高。

根据开发场景选择:Windows 平台的 MFC 项目优先用 CString,跨平台或 Qt 项目必须用 QString。两者在基础字符串操作上逻辑相似,迁移时主要注意编码转换和框架特有功能的差异。

相关推荐
清朝牢弟3 小时前
Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)
c++·qt·visual studio
深耕AI3 小时前
【MFC视图和窗口基础:文档/视图的“双胞胎”魔法 + 单文档程序】
c++·mfc
QT 小鲜肉3 小时前
【QT随笔】结合应用案例一文完美概括QT中的队列(Queue)
c++·笔记·qt·学习方法·ai编程
ChindongX6 小时前
CStringArray 和 CStringList
mfc
SNAKEpc121387 小时前
QML和Qt Quick
c++·qt
PH_modest7 小时前
【Qt跬步积累】—— 初识Qt
开发语言·qt
刘梓谦9 小时前
如何在Qt中使用周立功USB转CAN卡
开发语言·qt·zlg·周立功
江公望9 小时前
Qt QML实现无边框窗口
开发语言·qt
深耕AI9 小时前
【MFC典型类和函数:CString的字符串魔法与Afx全局函数的便利店】
c++·mfc