C ++中字符串初始化有什么不同?

时间:2010-02-03 13:40:54

标签: c++ string initialization

之间有什么区别吗?
std::string s1("foo");

std::string s2 = "foo";

4 个答案:

答案 0 :(得分:27)

是和否。

第一个是显式初始化,第二个是初始化复制。标准允许用第一个替换第二个。在实践中,生成的代码是相同的。

简而言之,这就是:

std::string s1("foo");

表单的字符串构造函数:

string ( const char * s );

s1

在第二种情况下。创建一个临时文件,并为该临时文件调用所提到的earler构造函数。然后,调用复制构造函数。 e.g:

string s1 = string("foo");

在实践中,第二种形式被优化,成为第一种形式。我没有看到没有优化第二种情况的编译器。

答案 1 :(得分:13)

从表面上看,第一个调用const char*构造函数来初始化s1。第二个使用const char*构造函数初始化临时值,然后使用复制构造函数,传入对该临时值的引用,以初始化s2

然而,标准明确允许称为“复制省略”的东西,这意味着正如AraK所说,即使复制构造函数具有可观察到的副作用,第二个也可以合法地替换为第一个,这样改变会影响程序的输出。

但是,当完成此替换时,编译器仍必须检查该类是否具有可访问的复制构造函数。所以潜在的区别在于第二种形式要求复制构造函数是可调用的,即使编译器不必调用它。显然std::string确实有一个,所以在这种情况下,这没有什么区别,但对于其他类,它可以。

答案 2 :(得分:3)

没有区别

答案 3 :(得分:-5)

第一个更好。

第二个将创建实例并将分配默认值(“”)。然后会有一个secodn assignement:“foo”。 所以2个作业而不是1 ...