"const char *"和"const string"之间的确切技术区别是什么?

9
我需要一个深入的技术解释,而不是解决方案。
我已经学习指针一个星期了,我对它的理解还不错。但是在编写程序时,我遇到了这个错误:
cannot convert ‘const std::string’ to ‘const char*’ for argument ‘2’ to ‘char* strcpy(char*, const char*)’
所以我通过string.c_str()很容易地解决了问题。但我非常想知道为什么会出现这种情况。我已经疯狂地搜索,为什么一个const字符串不同于const char*。当人们解释一个字符串时,他们说它和char*没有区别,那么为什么在字符串前面添加const不能使它成为一个const char *呢?

一个是类,一个是指向基本数据类型的指针? - Xymostech
char * 是指向 string 的指针,而不是字符串本身。因此出现了那个错误。 - Hanky Panky
1个回答

13

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

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

但是,string并不以'\0'终止自身(这是额外的工作而没有好处),所以问题变成了:如果需要在两种格式之间进行转换怎么办?

char*转换为string可以隐式发生,因为string有一个专门用于此目的的构造函数。但是要反过来,则必须告诉string对象以null字符结尾并为您提供有效的指针。 (它不会隐式地执行此操作,因为它可能需要额外的工作和/或导致代码中的意外情况。)


1
@reconx86:你混淆了两个不同的概念:*std::string* 是一个对象,但是“a string”只是一个表示“一段文本”的词语。你可以用任何你想要的方式来表示“a string”(也就是“文本”),通常使用 char*std::string 对象或类似的东西来表示它。确保你理解书中所讲的是对象还是抽象概念。 - user541686
@reconx86:你指的是std::string,但我相信书中所说的“字符串”仅仅是一个字符指针并不是同一个概念。 - user541686
我一直认为字符串是带有另一个关键字作为昵称的字符数组。不,我刚刚在上面向你解释了它是什么。忘记你之前学过的东西,再读一遍——你正在混淆C数组、"数组"的一般概念、指针、std::string和"字符串"的一般概念。请注意,你错误地使用了"关键字"这个词;你应该说"标识符"。关于" \0 是否终止了一个字符串会使字符数组吗?",这没有意义——你正在混淆字符串的可能实现与一般概念 - user541686
我再次阅读了所有的评论,我明白你的意思。我知道你指的是对象和表示之间有区别。你也说得对,我在阅读这本书时没有专注于这一点。 - userX
我认为我更好地理解了字符串是一个包装在类中的字符数组,这就是为什么它的功能不完全像字符数组的原因。 - userX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接