在C ++中,字符串类型对象是否像C字符串对象一样是字符数组?

时间:2018-10-07 20:41:29

标签: c++ c-strings

所以我知道所有C字符串都是C ++中的字符数组。字符串呢?

为什么char x[] = {'H', 'i'};不是C字符串? x是一个字符数组,表示它是C字符串。我想念什么吗?

4 个答案:

答案 0 :(得分:2)

在这里,我刚刚为您的问题找到了很好的解释:C strings and C++ strings。简而言之:

通常将C字符串声明为char数组。但是,char数组本身不是C字符串。有效的C字符串要求存在一个终止的“空字符”(ASCII值为0的字符,通常由字符文字'\ 0'表示)。

C ++字符串是类字符串的对象,该类字符串在头文件中定义且在标准名称空间中。字符串类具有几个构造函数,可以调用它们(显式或隐式)以创建字符串对象。

内存中的表示形式

C字符串 C-String

C ++字符串 C++ string

已更新:

您应该了解:

  1. 与C中的char相比,C ++提供的字符类型更多,例如UTF-16和UTF-32。

  2. C ++定义了一个名为std::basic_string的东西,它是用于从这些字符类型中提取字符串的类模板。

  3. C ++ typedef的{​​{1}}类型的类模板为char

现在,您知道std::stringstd::string型字符的basic_string。参考Does std::string need to store its character in a contiguous piece of memory?,如果您提到char,那么对于std::string及更高版本,它实际上是C++ 11型字符的AN数组(不是两个或更多数组)。对于char之前的C++版本或某些其他类型的字符(实际上我不确定),底层内存可能不是连续的(即,它可能需要两个或更多数组(而不是AN数组))用于存储字符串)。

答案 1 :(得分:0)

C字符串是 空终止的字符串 ,因此,任何不以零结尾的字符数组都不是C字符串。

C字符串是字符数组char *char []

但是关于C ++字符串,它是一个类,上面有很多操作(方法),它具有长度,并检查长度(例如C ++ vectorarray ),当您尝试访问它的数组下标时(使用at方法)。它的复制性能可能更高,因为已知分配新内存位置的长度。

您可以从C字符串创建std::string。有一个构造函数需要一个C字符串和一个长度,并从中创建一个std :: string。

所有处理字符串的C函数,都将C字符串视为以null结尾的字符串,因此,如果不是,则C将继续搜索最接近的下一个null,这非常危险。

答案 2 :(得分:0)

C ++提供了定义class string的标准库形式。类字符串不仅仅是一个C字符串(char* C或char sz [])。类字符串具有方法和属性,而后者则没有。同样,类字符串的大小会更改运行时,而后者不会更改。它还可以在其Ctor和dtor中为您管理内存。作为建议,请尽可能使用Class字符串,而不要使用char *。

  • Class String在字符串末尾附加一个NULL字符\0,以表示字符串末尾的符号,而后者则不行。

答案 3 :(得分:0)

如前面的答案中所述,char x [] = {'H','i'};不是有效的C字符串,因为没有空字符来标识字符串的终止或结尾。 C ++标准模板提供了String类,该类保证了动态连续内存分配(类似于Vector)并易于按索引访问。有关更多信息,请参见https://en.cppreference.com/w/cpp/string/basic_string