繁体   English   中英

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

[英]What are the differences in string initialization in C++?

两者之间有什么区别吗?

std::string s1("foo");

std::string s2 = "foo";

是和否。

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

简而言之,这就是:

std::string s1("foo");

表单的字符串构造函数:

string ( const char * s );

被称为s1

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

string s1 = string("foo");

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

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

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

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

没有区别

第一个更好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM