在C ++中,字符串a =“ hello”和字符串a =(char *)“ hello”有什么区别?

时间:2019-11-22 07:11:40

标签: c++

在c ++中这两个字符串初始化之间有什么区别? 我在两个程序中得到相同的输出。 程序1

void main(){
    string a = "hello";
    cout<<a;
}

程序2

void main(){
    string a = (char *)"hello";
    cout<<a;
}

3 个答案:

答案 0 :(得分:5)

"hello"string literal。它的类型是

  

const char[N],其中N是包含空终止符的字符串[...]的大小。

因此,在这种情况下,类型为const char[6]。请注意const

现在可以从const char*构造std::string(链接中的构造函数5)。再次注意const

在C ++中,可以将非const对象传递给需要const的函数。对于您而言,强制转换(char *)会删除const,但是会立即在构造函数调用中将const重新放置。

所以基本上没有区别。它们将编译为完全相同的东西。


一些附加说明:

  1. 放弃const-ness非常危险。如果您实际上尝试更改char数组中的任何内容,则您的程序将拥有Undefined Behaviour
  2. using namespace std;widely considered to be bad practice
  3. void main()main函数来说不是有效的签名; it must return an int
  4. C中使用C++样式的强制转换也被认为是不好的做法-很难在代码中发现,并且C++为更特定的情况提供了更安全的等效项:{{ 3}},const_caststatic_cast和(最危险的)dynamic_cast

答案 1 :(得分:4)

实际上,不需要额外的char *类型转换。

在两种情况下都完成了副本初始化。

string (const char* s);

read more on copy initialization

答案 2 :(得分:0)

std::string是typedef,用于在char(代表字符序列的对象)上模板化的basic_string类的专业化。

表达式string a = "hello"对应于静态分配大小的字符流。

简短,简单和类型安全的std::cout是在标准对象上模板化的ostream类的typedef(提供对高级输出操作的支持)。

cout表示“标准字符输出设备”,动词<<表示“输出对象”。

cout << a;将字符串像流一样发送到stdout

char *是指向常量字符的特殊指针,它们指向ASCII字符串,例如:

const char * s = "hello world";

表达式(char *)"hello"对应于char *指针,在这里您抛弃了const,但是构造函数立即将const放回了调用。

因此,

cout将打印字符串,因为它具有char *的特殊运算符,它将被视为指向输出字符串的C样式字符串(第一个字符)的指针。

char*const char*cout会将操作数视为指向C样式字符串(第一个字符)的指针,并打印该字符串的内容: