【问题标题】:C++ - Is string a built-in data type?C++ - 字符串是内置数据类型吗?
【发布时间】:2023-03-14 10:45:02
【问题描述】:

C++ 中,string 是内置数据类型吗?

谢谢。

【问题讨论】:

  • 不,我的编辑没有突出显示它:-)

标签: c++ string built-in-types


【解决方案1】:

您想使用的内置的定义是什么?是内置您拥有的编译器工具集,它应该。编译器是否对其进行了特殊处理? no,编译器将该类型视为任何用户定义的类型。请注意,这可能适用于大多数人会回答的许多其他语言。

C++ 委员会的重点之一是将核心语言保持在最低限度,并在库中提供尽可能多的功能。这有两个目的:核心语言更稳定,库可以重新实现,增强......而不改变编译器核心。但更重要的是,您不需要特殊的编译器支持来处理大多数标准库,这一事实保证了核心语言对于大多数用途来说足够表达。

更简单的否定形式表示:如果语言需要特殊的编译器支持来实现std::string,那意味着用户没有足够的能力在核心语言中表达那个或类似的概念。

【讨论】:

  • 标准使用短语built-in 来表示那些编译器内在函数(不在库中的东西)。
【解决方案2】:

它不是原始的——也就是说,它不像intchar 等那样“内置”。最接近的内置类字符串类型是 char *char[],这是旧的 C 处理字符串的方法,但即使这样也需要一堆库代码才能有效地使用。

相反,std::string 是几乎所有现代 C++ 编译器都附带的标准库的一部分。您需要#include <string>(或包含其他包含它的内容,但实际上您应该包含您的代码所引用的内容)才能使用它。

【讨论】:

    【解决方案3】:

    如果你在谈论 std::string 那么不是。

    如果你说的是字符数组,我猜你可以把它当作一个内置类型的数组。

    【讨论】:

      【解决方案4】:

      取决于内置的意思,但可能不是。 std::string 由标准库(因此也是 C++ 标准)定义,并且被不同的编译器非常普遍地支持,但它不是像 intchar 这样的核心语言的一部分。

      【讨论】:

        【解决方案5】:

        没有。

        内置类型或“原始”类型可用于使用内置类型 char 创建字符串生命周期功能。这与实用函数一起在 C 中使用。在 C++ 中,仍然存在此功能,但添加了更直观的字符串使用方式。

        string 类是 std 命名空间的一部分,是 basic_string 模板类的实例化。它被定义为

        typedef basic_string<char> string;
        

        它是一个能够根据需要动态调整大小的类,并且具有许多充当实用程序的成员函数。它还使用运算符重载,因此使用起来更直观。但是,此功能也意味着它在速度方面存在开销。

        【讨论】:

          【解决方案6】:

          可以是内置的,但不是必须的。

          C++ 标准库为其组件提供了文档化的接口。这可以作为库代码或编译器内置实现。标准并没有说明应该如何实施。

          当您使用 #include &lt;string&gt; 时,您可以使用 std::string 实现。这可能是因为编译器直接实现它,或者因为它链接到一些库代码。我们不确定,除非我们检查每个编译器。

          没有一个已知的编译器选择将其设为内置类型,因为他们不必这样做。纯库实现的性能显然已经足够了。

          【讨论】:

            【解决方案7】:

            没有。它是标准库的一部分。

            【讨论】:

              【解决方案8】:

              不,string 是一个类。

              【讨论】:

              • 字符串不是类,而是提供字符串操作方法而不是对象来存储字符串的库。
              • @Kush:也许它被简化了,但即使在 C++ 标准(open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf)中,他们也谈到了一个字符串类(第 21 章,字符串库)
              • @Dadam:同意这个词,但是那些“只”熟悉“类”这个词的人可能想知道他们是否可以创建string类的对象,这在C++下可能是不可能的,因此在一般意义上将其作为方法库提及将更具相关性。
              • @Dadam: this 页面显示了如何创建字符串对象,但存储字符串的内存是使用 char* 而不是 string 对象本身分配的,并且方法是单独使用的,而不是使用对象名称访问,就像我们在任何 OOP 语言中所做的那样; strobj.strrev();。因此,根据标准 OOP 规范,C++ 中的字符串不能充当其对象本身存储值并可以访问其方法的类。不过,在“C++ STL 字符串”中,仍然可以使用点. 运算符来访问方法。
              • @Kush:标准的 OOP 术语与达达姆所说的无关——C++ 标准定义了 C++ 上下文中“类”的含义,std::string 是一个类。
              【解决方案9】:

              绝对不是。 String 是标准库中的一个类。 char *char[] 是内置类型,但 char、int、float、double、void、bool 没有任何添加(如指针、数组、符号或大小修饰符 - 无符号、长整数等)是基本类型。

              【讨论】:

                【解决方案10】:

                没有。有不同的实现方式(例如 Microsoft Visual C++),但 char* 是 C++ 表示字符串的方式。

                【讨论】:

                • 不是真的,不准确。 char*是C表示字符串的方式,const char[]是字符串字面量的类型,std::string标准的字符串表示方式。
                • 不同的实现?事实上std::string-type 是标准的并且有一个标准接口,所以它/是/表示字符串的“C++方式”,而不是char*(这也不太正确,如果你的意思是字符串文字,你应该使用const char*).
                • 这是不正确的。 string 类是 C++ 方式。 char* 是 C 方式。
                • "char* 是 C++ 表示字符串的方式" wtf
                猜你喜欢
                • 1970-01-01
                • 2012-09-13
                • 1970-01-01
                • 2010-11-29
                • 2013-01-20
                • 1970-01-01
                • 1970-01-01
                • 2019-11-21
                • 1970-01-01
                相关资源
                最近更新 更多