字符串声明

时间:2016-02-03 05:00:50

标签: c++ string pointers stl

当我以下列方式声明时,字符串声明起作用:

URL.revokeObjectURL

但是在以下情况下:

string a = "xyz";
char a[] = "xyz";

它在g ++ 4.9.2编译器中给出了错误:

  

警告:已弃用从字符串常量转换为'char *'   [-Wwrite-strings] char * a =“xyz”;

我认为这三种声明类型彼此不同。请帮帮我。

2 个答案:

答案 0 :(得分:2)

string a = "xyz";

这使用初始化程序语法来调用构造函数std::string( const char* )

char a[] = "xyz";

这声明了一个足以存储字符串加终结符的数组。它遵循标准的数组初始化规则。可以认为它等同于char a[] = { 'x', 'y', 'z', '\0' };

char *a = "xyz";

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

const char *a = "xyz";

答案 1 :(得分:2)

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

char* a = "xyz";

现在,你必须使用:

char const* a = "xyz";

字符串文字,例如"xyz"位于程序的rea-only部分。它可用于初始化char const*,因为您不应该修改char const*指向的内容。使用它来初始化char*会打开用户意外修改它们的可能性。此外,修改此类字符串会导致未定义的行为。

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

char a[] = "xyz";

没问题。

该行

string a = "xyz";

调用string的构造函数,该构造函数接受char const*,然后使用该对象初始化a。因此,那条线也行。