以下声明之间有什么区别?

时间:2018-11-16 07:50:45

标签: c++ string constructor

string str("Hello World");
string str="Hello World";

我似乎不太了解两者之间的区别。根据我的教科书,第一个语句执行的操作是“使用C字符串初始化构造函数”。那么,第一条语句是否定义了C字符串,第二条语句定义了C ++字符串?另外,请解释一下C字符串和C ++字符串之间的区别。

3 个答案:

答案 0 :(得分:4)

这两行都创建一个名为std::string的C ++ str。并且都从C字符串初始化它们。区别在于它们的初始化方式:

第一个是direct initialization

string str("Hello World");

这将调用string(const char *)构造函数。

第二个是copy initialization

string str = "Hello World";

这需要string(const char *)构造函数为非explicit(对于先前的方法,构造函数可以为explicit)。 根据标准的版本,我们会有一些不同的行为:

  • 在C ++ 17之前的版本:首先,创建一个临时对象(使用string(const char *)),然后调用复制(或移动)构造函数以初始化str。因此,复制(或移动)构造函数需要可用。可以省略复制构造函数阶段(因此,就像直接初始化情况一样创建对象),但是仍然需要复制(或移动)构造函数。如果不可用,则代码将无法编译。
  • 发布C ++ 17:此处,因为标准保证copy elision,所以仅调用string(const char *)构造函数。复制(或移动)构造函数不需要可用。如果复制构造函数不可用,则代码仍会编译。

因此,对于这种特殊情况,两次初始化之间的末尾没有真正的区别,因此,两个str字符串将变为相同。

答案 1 :(得分:3)

两条线都定义了名为$VAR1 = { 'peach' => 1, 'pear' => 2, 'apple' => 3 }; 的类型std::string的变量,该变量由str的构造函数构造,并以std::string作为其参数。这些行没有区别。

  

[...] C字符串[...] C ++字符串[...]?

通常所说的C字符串不过是char const*的零终止数组:

char

"foobar"; // an array of 7 const chars. 7 instead of 6 because it is 0-terminated. char foo[] = "foobar"; // an array of 7 chars initialized by the string given 是C ++标准库的一类,用于管理动态长度的字符串资源。

答案 2 :(得分:1)

“ Hello World”是C字符串(字符的空终止序列)。在两种情况下,string(或全名是std::string)都是c ++字符串(不以null终止)。

两条线都调用使用c字符串并构造一个std::string的同一构造函数。