【问题标题】:What is the difference and the relationship of char and CString [duplicate]char和CString有什么区别和关系[重复]
【发布时间】:2013-03-01 05:28:13
【问题描述】:

谁能解释一下 char * 和 CString 之间的区别和关系?...谢谢。

【问题讨论】:

  • CString 旨在供 C++ 代码使用,而原始的 char* 基本上不应该在 C++ 代码中使用。

标签: c++ visual-c++ mfc


【解决方案1】:

CString 将是char 的数组,char* 将是指向char 数组的指针,您可以使用它来迭代字符串的字符。

其实来自MSDN

CString 基于TCHAR 数据类型。如果为你的程序定义了符号_UNICODE,则TCHAR定义为类型wchar_t,16位字符类型;否则,它被定义为 char,即普通的 8 位字符类型。那么,在 Unicode 下,CString 对象由 16 位字符组成。 如果没有 Unicode,它们是由 8 位 char 类型组成的。

【讨论】:

    【解决方案2】:

    有几个重要的区别。

    char * 是指向char 的指针。通常你不能说它是单个字符还是字符串的开头,长度是多少。所有这些都是由程序逻辑和一些约定决定的,即标准 C 函数,喜欢使用 const char * 作为输入。您需要手动管理为字符串分配的内存。

    CString 是一个宏。根据您的程序编译选项,它可以定义为CStringACStringW 类。有不同也有相似之处。

    不同之处在于CStringA对非Unicode数据进行操作(类似于char*),而CStringW是一个Unicode字符串(类似于wchar_t*)。

    然而,这两个类在字符串操作和存储管理方面是等价的。它们更接近标准 C++ std::stringstd::wstring 类。

    除此之外,CStringACStringW 都提供了将字符串转换为 Unicode 格式的功能。

    【讨论】:

    • CStringA/CStringW 和 std::string/std::wstring 完全不同。它们唯一的共同点是它们都是处理字符串的 C++ 类。当尝试使使用 CString 的 ATL/WTL 用户界面代码与使用 std::string/wstring 和标准容器的后端代码很好地配合时,这种差异非常明显。
    • @Zadirion 这两个类都提供了一个成员函数,该函数返回指向 C 样式字符串的指针,这使得互操作变得微不足道。它们实现之间的差异与上帝的意图无关。在考虑使用类时,应该只关心接口。
    • @CodyGray 当然,它们之间的转换不是火箭科学。但是缺乏隐式转换以及 CString 没有对容器概念进行建模这一事实确实使它很难使用,如果 UI 框架不需要它,人们宁愿避免使用它。不过从好的方面来说,CString 更轻量级,而且它还有有用的 Format 方法,如果你喜欢编写标准代码,你只能通过 boost::format 获得。
    【解决方案3】:

    CString 是一个包含不同功能的类。MSDN

    char * 只是一个常规的 c++ 数据类型。

    CString 主要用于 MFC 应用程序。

    【讨论】:

    • 是的,我在 MFC 应用程序中使用它。
    【解决方案4】:

    CString 是一系列 TCHAR-s 而不是 char*。主要区别在于,如果定义了 UNICODE,CString 将是 wchar 的序列。实际上取决于该宏 CString 将被 tpyedef -ed 到 CStringA 或 CStringW。另一个主要区别是 CString 是一个,而 char* 只是一个指向字符的指针。

    【讨论】:

      【解决方案5】:

      根据 TCHAR 的类型,CString 可以是 CStringA 或 CStringW。

      也就是说,CString 是一个字符数组的包装器,它使您能够轻松地将该字符数组视为字符串,并以与字符串类型相关的方式对其进行操作。

      对于它们之间的关系,这里有一个很容易说明的东西。您可以像这样在 char * 和 CString 之间进行转换:

      CString str = "abc"; // const char[3] or char * to CString

      const char * p = str.Get() // CString 到 const char *

      【讨论】:

        【解决方案6】:

        CString 是一个类,它提供了许多 char * 没有的功能。 char * 只是一个指向 char 或 chars 数组的指针。

        CString 包含一个与 char * 大致相同的缓冲区:LPTSTR GetBuffer( int nMinBufLength );

        LPTSTRchar * 之间的区别转到 herehere

        【讨论】:

          【解决方案7】:

          CString 是一个围绕 char* 的包装类,用于提供一些有用的附加功能,并对用户隐藏内存分配/释放。 性能方面没有太大差异,所以如果您使用 MFC 类,您不妨使用 CString。

          【讨论】:

            猜你喜欢
            • 2015-12-12
            • 2012-08-14
            • 1970-01-01
            • 2020-07-29
            • 2014-02-15
            • 2015-01-17
            • 2016-06-20
            • 2014-07-07
            • 1970-01-01
            相关资源
            最近更新 更多