0
char* c_arguments[] = { "hi","bye" }; //(1)
std::string cpp_arguments[]= { "hi","bye" };

(1) 在 C++17 标准下 Visual Studio 报错

E0144:“const char*”类型的值不能用于初始化“char *”类型的实体</p>

如果我const在开头添加代码编译得很好。

但是为什么第一行需要 const 而第二行不需要呢?

如何在char*[]没有 const 的情况下从字符串文字数组创建?

代码可以使用最新 C++ 标准的特性,而不必考虑遗留系统。

4

4 回答 4

2

第二行是调用复制构造函数。即使文字是只读的,副本也不是。

要创建指向可写字符串的指针数组,您必须循环并创建每个文字的副本,就像std::string构造函数所做的那样。

于 2019-04-22T01:38:41.520 回答
2

字符串是对象,在底层,编译器正在创建两个const char*缓冲区,然后将这些值复制到字符串对象中以提供可变数组。如果你愿意,你可以做同样的事情来创建你的char*指针。

我不建议char*在 C++ 中使用没有 const 的文字指针。有很多方法可以把它们搞砸。如果要修改字符缓冲区,则应将它们包装在字符串中并使用适当的库函数。

于 2019-04-22T01:42:22.603 回答
2

第一种类型c_是指向 的指针数组char。第二种类型cpp_是 s 数组std::string

当您将 a 传递"string"给指针时,它会生成指向第一个元素的指针。但是数据的类型"hello"const;所以 achar*不想指向它。相反,您需要一个char const*,或指向const chars 的指针。

对于 a std::string,当您传递"hello"给它时,它会将字符复制std::string. 副本可以是可变的,因此不需要const.

在将字符串文字const分配给 ; 时,有些编译器标志放弃了对; 但是,它们的存在是为了与以前编写的代码兼容。避免使用它们。如果您在使用这些标志后不小心修改了字符串常量,则会发生未定义的行为(很可能使用字符串池会导致精神错乱)"hello"char*const

于 2019-04-22T12:14:31.787 回答
1

在 C++ 中,本质上存在原始数据类型和用户定义的数据类型。语言中内置了原始数据类型,如 int、char、指针。用户定义类型建立在原始类型之上。

一些 C++ 用户定义类型是可以在后台执行一些用户定义操作的类。std::string就是这样的类型。使用构造函数初始化字符串类型的对象。

c++中所有引用的字符串都是const字符集,这意味着程序无权修改它们。

const char *str = "abc";只是声明一个指向常量字符串'abc'的指针。因此它必须是'const'。

std::string stdstr = "abc";string从命名空间声明一个类的对象std。对象的初始化调用string. 后者将字符串复制到内部存储中。复制不能修改“abc”字符集。所以,不存在冲突。

在第一种情况下,您不能修改指针,换句话说str[1] = 'd';是非法的。它厌倦了直接修改常量(只读)字符串。在第二种情况下,您可以修改“abc”的副本stdstr[1] = 'd';是合法的。

于 2019-04-22T02:46:40.363 回答