“const char *”和“const string”之间的确切技术区别是啥

Posted

技术标签:

【中文标题】“const char *”和“const string”之间的确切技术区别是啥【英文标题】:What is the EXACT technical difference between "const char *" and "const string"“const char *”和“const string”之间的确切技术区别是什么 【发布时间】:2013-03-22 05:04:52 【问题描述】:

我需要对我要问的问题进行深入的技术解释,而不是解决方案。

我已经学习了一个星期的指针,我理解得很好。但是在编写程序时,我偶然发现了这个错误:

无法将参数“2”的“const std::string”转换为“const char*”到“char* strcpy(char*, const char*)”

所以我很容易用string.c_str() 解决了,没问题。但我对为什么会这样很感兴趣。我一直在疯狂搜索为什么 const 字符串与 const char * 不同。当人们解释一个字符串时,他们会说它与 char * 没有什么不同,那么为什么在字符串之前添加一个 const 不能使其成为 const char *

【问题讨论】:

一个是类,一个是指向原始数据类型的指针? char * 是指向 string 的指针,但不是字符串本身。因此这个错误 【参考方案1】:

string对象,用于保存文本数据(字符串),char*指针,指向用于保存的内存块文本数据(字符串)。

string“知道”它的长度,但char* 只是一个指针(指向一个字符数组)——它没有长度信息。因此,为了能够推断出由char* 表示的“字符串”的长度,您必须用一些特殊的东西来终止它,这通常是C 中的空字符'\0'

但是string 不会以'\0' 结束自身(这是无益的额外工作),所以问题就变成了:如果您需要在两种格式之间进行转换怎么办?

char* 转换为string 可以隐式发生——string 有一个专门用于此目的的构造函数。但反过来,您必须告诉 string 对象以空值终止自身,并为您的目的提供一个有效的指针。 (它不会隐含地这样做,因为它可能需要额外的工作和/或导致代码事故。)

【讨论】:

@reconx86:您混淆了两个不同的东西:std::string 是一个对象,但“字符串”只是一个表示“一段文本”的词.您可以以任何您想要的方式表示“字符串”(意思是“文本”),通常,它们使用char*std::string 对象或类似的东西来表示它.确保你理解这本书在谈论什么——对象或抽象概念。 @reconx86:指的是std::string,是的,但我很确定当他们说“一个字符串”时,这些书并没有做同样的事情是“只不过是一个字符指针”。 “我一直认为字符串是字符数组,另一个关键字是昵称。” 不,我只是在上面向您解释了它是什么。忘记你之前已经学过的东西,然后再读一遍——你把 C 数组、“数组”的一般概念、指针、std::string 和“字符串”的一般概念相互混淆了。请注意,您错误地使用了“关键字”这个词;你应该说“标识符”。关于 “\0 终止一个字符串是否构成一个 char 数组?”,这是没有意义的——您将字符串的可能 实现 与一般 概念。 我再次阅读了所有的 cmets,我明白你的意思。我知道你的意思是对象和表示之间存在差异。你对这本书的看法也是对的 我想我更好地理解了一个字符串,它是一个包装成一个类的 char 数组。这就是为什么它的功能不像 char 数组。 ***.com/questions/1287306/…***.com/questions/801209/c-char-vs-stdstring

以上是关于“const char *”和“const string”之间的确切技术区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

const char []和const char之间的区别*

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

c++关于const char*的问题

const char*、const char(&)[N] 和 std::string 的函数重载

char *和const char *之间的区别?

请问C语言如何把2个const char * const s1的字符串合并?