字符串声明
String Declaration
当我
通过以下方式声明时,字符串声明起作用:
string a = "xyz";
char a[] = "xyz";
但在以下情况下:
char *a = "xyz";
它在 g++ 4.9.2 编译器中给出了一个错误:
警告:已弃用从字符串常量到"char*"的转换 [-Wwrite-strings] char *a = "xyz";
我认为这三种声明类型彼此不同。请帮帮我。
string a = "xyz";
这使用初始值设定项语法来调用构造函数std::string( const char* )
。
char a[] = "xyz";
这声明了一个足够大的数组来存储字符串和终止符。 它遵循标准的数组初始值设定项规则。 把它想象成等同于char a[] = { 'x', 'y', 'z', ' ' };
char *a = "xyz";
这需要一个字符串文字("xyz"
)并将其分配给一个非常量指针。 在语言中,这样的指针意味着可以修改它指向的字符串,但在这种情况下这是未定义的行为,因为字符串文字可能无法修改。 为了防止您犯此类错误,编译器会向您发出警告。 以下内容有效,不会发出警告:
const char *a = "xyz";
在该语言的早期版本中,您可以使用:
char* a = "xyz";
现在,您必须使用:
char const* a = "xyz";
字符串文本(如 "xyz"
)驻留在程序的仅 rea 部分中。它可用于初始化char const*
因为您不应该修改char const*
指向的内容。使用它来初始化char*
打开了用户意外修改它们的可能性。此外,修改此类字符串会导致未定义的行为。
字符串文本也可用于初始化char[]
。在这种情况下,字符串文本将复制到为数组分配的空间中。因此,没有修改程序只读数据的风险。因此,使用
char a[] = "xyz";
没关系。
该行
string a = "xyz";
调用采用char const*
的 string
的构造函数,然后使用该对象初始化a
。因此,这条线也可以。
相关文章:
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 声明要在 qml 和 cpp 文件中使用的全局字符串
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明
- 为什么必须将 const 添加到 constexpr 中才能进行字符串文字声明?
- 如何声明接受字符串、返回void的闭包的类型
- 我在 c++ 中声明字符串类型时遇到问题
- 在此范围C 中未声明字符串和char变量
- 无法声明字符串变量
- C++可变内存中声明字符串文本
- 如何在 c++ 中的类中声明字符串成员
- 在arduino中声明字符串的问题
- 声明字符串流ss之间的差异;和std::字符串流ss;在C++中
- 如何让用户输入声明字符串数组的大小
- 用常量字符串和字符串常量声明字符串有什么区别
- 可以使用特定名称声明字符串[]
- 在类中声明字符串类型(c++)
- 在GNU c++中声明字符串数组
- c++无法在派生类中声明字符串
- 使用声明字符串的 cin.getline