2013-04-25 99 views
2

我很困惑,接着概念:混淆直接初始化和复制初始化

string str="123"; 

有的书说:使用“=”是拷贝初始化,

但有些文章说:string str="123"是一样的string str("123")。毫无疑问,str(“123”)是直接初始化的。

那么哪种款式适合string str="123";

如何判断哪些是复制初始化或直接初始化?

+0

这一切都取决于你的编写代码的风格。 – plsgogame 2013-04-25 08:13:38

+1

请参阅[copy initianization](http://www.gotw.ca/gotw/036.htm)。 – juanchopanza 2013-04-25 08:21:31

+0

你的意思是说,使用'='是复制初始? – jiafu 2013-04-25 08:22:11

回答

0

是的,这就是所谓的复制初始化。

相反默认构造STR,然后使用string(const char*)构建另一个string"123"然后,指派两个字符串的,编译器只是构造一个使用字符串的字符串(常量字符*)用“123”。

string str="123"string str("123")相同。毫无疑问 STR(“123”)直接初始

然而记得是可能的,只有对应的构造是不explicit

+0

是与复制构造函数相关的字符串str =“123”并被称为复制初始? – jiafu 2013-04-25 08:37:03

+0

@jiafu - 是的,它与拷贝构造函数“相关”,因为它正式涉及拷贝,但编译器会优化它。如果你有一个用户定义的类,其构造函数是'explicit','private'或'delete',你可能会注意到一个区别。对于'std :: string',情况并非如此。 – 2013-04-25 08:42:38

+0

@jiafu您可以从我提供的链接中获得更详细的信息,包括何时以及如何使用复制初始化。 – stardust 2013-04-25 08:46:28

4

它只是语法的问题:

  • T x = y;副本初始化

  • T x(y);直接初始化

对于任何类型的T都是如此。具体发生什么取决于哪种类型的T。对于原始类型(例如int s),两者完全相同。对于类类型(例如std::string),两者实际上是相同的,尽管复制初始化要求复制构造函数是可访问的和非显式的(尽管在实践中实际上不会调用它)。

+0

是与str拷贝构造函数相关的字符串str =“123”并被称为复制初始? – jiafu 2013-04-25 08:37:57

+0

@家福:语法形式是“复制初始化”。它会导致一个调用,转换构造函数,但是,它需要一个'char const *'。原则上,可能有两个*构造函数调用,转换后跟着复制,但第二个调用通常是被忽略的。 – 2013-04-25 08:40:15