之间有什么区别吗?
std::string s1("foo");
和
std::string s2 = "foo";
答案 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 ...