Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串声明_C++_String_Pointers_Stl - Fatal编程技术网

C++ 字符串声明

C++ 字符串声明,c++,string,pointers,stl,C++,String,Pointers,Stl,当我以以下方式声明时,字符串声明有效: 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*) 这声明了一个足够

当我以以下方式声明时,字符串声明有效:

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*)

这声明了一个足够大的数组来存储字符串和终止符。它遵循标准数组初始值设定项规则。把它想象成相当于
chara[]={'x','y','z','\0'}

char *a = "xyz";
这将获取字符串文本(
“xyz”
)并将其分配给非常量指针。在语言中,这样的指针意味着可以修改它所指向的字符串,但在本例中这是未定义的行为,因为不能修改字符串文本。为了防止您犯这样的错误,编译器会给您一个警告。以下内容有效,不会发出警告:

const char *a = "xyz";
这使用初始值设定项语法调用构造函数
std::string(const char*)

这声明了一个足够大的数组来存储字符串和终止符。它遵循标准数组初始值设定项规则。把它想象成相当于
chara[]={'x','y','z','\0'}

char *a = "xyz";
这将获取字符串文本(
“xyz”
)并将其分配给非常量指针。在语言中,这样的指针意味着可以修改它所指向的字符串,但在本例中这是未定义的行为,因为不能修改字符串文本。为了防止您犯这样的错误,编译器会给您一个警告。以下内容有效,不会发出警告:

const char *a = "xyz";
在该语言的早期版本中,您可以使用:

char* a = "xyz";
现在,您必须使用:

char const* a = "xyz";
字符串文本,例如
“xyz”
驻留在程序的rea-only部分中。它可以用来初始化
char const*
,因为您不应该修改
char const*
指向的内容。使用它初始化
char*
会打开用户意外修改它们的可能性。此外,修改这些字符串是导致未定义行为的原因

字符串文字也可用于初始化
char[]
。在这种情况下,字符串文本被复制到为数组分配的空间。因此,不存在修改程序只读数据的风险。因此,使用

char a[] = "xyz";
没关系

线路

string a = "xyz";
调用
string
的构造函数,该构造函数接受
char常量*
,然后使用该对象初始化
a
。因此,该行也可以。

在该语言的早期版本中,您可以使用:

char* a = "xyz";
现在,您必须使用:

char const* a = "xyz";
字符串文本,例如
“xyz”
驻留在程序的rea-only部分中。它可以用来初始化
char const*
,因为您不应该修改
char const*
指向的内容。使用它初始化
char*
会打开用户意外修改它们的可能性。此外,修改这些字符串是导致未定义行为的原因

字符串文字也可用于初始化
char[]
。在这种情况下,字符串文本被复制到为数组分配的空间。因此,不存在修改程序只读数据的风险。因此,使用

char a[] = "xyz";
没关系

线路

string a = "xyz";

调用
string
的构造函数,该构造函数接受
char常量*
,然后使用该对象初始化
a
。因此,这句话也可以。

我不明白为什么这个答案被否决了。它清晰、正确,甚至提供了一点历史。@paddy,我也是。希望他们能解释:)RSahu和@paddy这两个答案都能帮助我理解这个问题。感谢您的回复。:)@biswasJUCSE,很高兴我们能提供帮助。我不明白为什么这个答案被否决了。它清晰、正确,甚至提供了一点历史。@paddy,我也是。希望他们能解释:)RSahu和@paddy这两个答案都能帮助我理解这个问题。感谢您的回复。:)@biswasJUCSE,很高兴我们能提供帮助。这是一个警告,不是一个错误。“警告”这个词就是线索。这是警告,不是错误。“警告”一词就是线索。