2010-02-03 62 views

回答

26

是和

首先是明確初始化號,第二個是拷貝初始化。該標準允許用第一個替換第二個。實際上,生成的代碼是相同的。

下面是簡而言之會發生什麼:

std::string s1("foo"); 

形式的字符串構造:

string (const char * s); 

被調用s1

在第二種情況下。創建一個臨時對象,併爲該臨時對象提供所述的構造函數。然後,複製構造函數被調用。例如:

string s1 = string("foo"); 

在實踐中,第二種形式被優化,成爲第一種形式。我還沒有看到一個不優化第二種情況的編譯器。

+0

拷貝構造函數不會在第二種情況下被調用,只會調用字符串(const char * s)。這是複製初始化。檢查:[how-c-implicitly-convert-c-style-string-to-a-string-object](http://stackoverflow.com/questions/35568612/how-c-implicitly-convert-c-style-字符串到字符串對象) – expoter 2016-02-23 05:36:09

-5

第一個比較好。

第二個將創建實例並將分配默認值(「」)。然後會有一個secodn分配:「foo」。 所以2的作業,而不是1 ...

+7

不,第二個不會調用賦值運算符。 – 2010-02-03 13:48:32

13

表面上,第一個調用const char*構造函數來初始化s1。第二個使用const char*構造函數初始化一個臨時值,然後使用複製構造函數傳入對該臨時值的引用,以初始化s2

然而,標準明確允許所謂的「複製省略」,這意味着,阿拉克說,第二個可以合法地與第一更換,即使拷貝構造函數具有可觀察到的副作用,這樣的變化影響程序的輸出。

但是,當這個替換完成後,編譯器仍然必須檢查該類是否有可訪問的拷貝構造函數。所以一個潛在的區別是第二種形式需要一個拷貝構造函數來調用,即使編譯器不需要調用它。很明顯std::string確實有一個,所以在這種情況下,這並沒有什麼區別,但對於其他類可以。

+1

你得到了我的+1「標準明確允許所謂的」複製elision「;) – AraK 2010-02-03 14:03:09

+0

小招供:在發佈後,我注意到它是在索引中的」複製構造函數elision「,但據我記得我已經提到它作爲「複製elision」:-) – 2010-02-03 18:04:53

相關問題