26

为什么我看到一些代码使用CStrings不同的声明。

有些使用这种格式

char a_c_string [];

而其他人使用

CString another_c_string;

有区别吗?我在第一个示例中找到的所有参考都CStrings声明它,我只在论坛等人们给出示例的地方看到它以其他方式完成。

4

3 回答 3

41

CString既不是 C 也不是 C++ 类型。它似乎是微软的一项发明,本质上可以替代std::string

  • CString对象可以由于连接操作而增长。
  • CString对象遵循“价值语义”。将CString对象视为实际字符串,而不是指向字符串的指针。
  • 您可以自由地替换CString对象const char*LPCTSTR函数参数。
  • 转换运算符可将字符串的字符作为只读字符数组(C 样式字符串)直接访问。

我建议忽略它,以便:

(a) 人们知道你在说什么;
(b) 您的代码是可移植的;
(c) 你正在编写每个人都可以根据全球公认的 ISO C++ 标准合理化的 C++,许多人为了这个明确的目的花了很多很多时间争论(你知道,而不是少数人在一间公司办公室的房间)。

它仅在您使用Microsoft Visual C++进行编程时可用,这在很大程度上是有限制的。

于 2013-01-23T06:30:03.560 回答
28

许多 GUI 框架都有自己的字符串类。例如 QT 有QString, wxWindows 有wxString。在这种情况下,MFC 具有 CString。在 MFC gui 代码的上下文中使用 CString 会很方便且有意义,因为那时您已经严重依赖 Visual C++,并且不会设想代码可移植性。我会小心一揽子声明说忽略它,因为它是非标准的——这完全取决于上下文。

于 2013-01-23T06:42:45.727 回答
13

以防万一这是造成混淆的原因:“CString”中的“C”只是 MFC 中所有类都具有的前缀。MFC 是 Microsoft 包装 win32 API 的 C++ 库。这个字符串类与“C 字符串”关系不大,后者用于描述C 语言提供的字符串处理工具。C 语言仅提供用于字符串处理的函数,这些函数对指向表示字符串的 char 数组的指针进行操作,并且它们要求最后一个字符是 NUL(也称为 NUL 终止或零终止)。请注意,C++ 本身也有一个字符串类std::string(嗯,实际上还有 std::wstring 和 std::basic_string 模板,但作为初学者,您可以放心地忽略它们)。

于 2013-01-23T06:33:36.707 回答