2013-04-25 109 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