在c ++中这两个字符串初始化之间有什么区别? 我在两个程序中得到相同的输出。 程序1
void main(){
string a = "hello";
cout<<a;
}
程序2
void main(){
string a = (char *)"hello";
cout<<a;
}
答案 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
重新放置。
所以基本上没有区别。它们将编译为完全相同的东西。
一些附加说明:
const
-ness非常危险。如果您实际上尝试更改char
数组中的任何内容,则您的程序将拥有Undefined Behaviour。using namespace std;
是widely considered to be bad practice。void main()
对main
函数来说不是有效的签名; it must return an int
。C
中使用C++
样式的强制转换也被认为是不好的做法-很难在代码中发现,并且C++
为更特定的情况提供了更安全的等效项:{{ 3}},const_cast
,static_cast
和(最危险的)dynamic_cast
。答案 1 :(得分:4)
答案 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样式字符串(第一个字符)的指针,并打印该字符串的内容:>