2011-11-22 74 views

回答

7

不,沒關係。兩者都會導致對相同構造函數的調用。

+2

不第二調用拷貝構造函數,可以通過使用第二種形式來避免? –

+3

@Paul:它可以,但大多數編譯器不會啓用優化(另請參閱'copy elision')。這基本上是_direct-initialization_和_copy-initialization_之間的區別。 – ildjarn

+1

@ildjarn編譯器用代碼解決問題的事實是不言而喻的。如果沒有進行優化,第二個版本可能會比第一個版本慢兩倍,當然不會以任何方式使用C++ ish。 :) –

4

你應該這樣做的第一種方式,因爲如果你這樣做第二種方式,我相信編譯器做了一些比必要的更復雜的事情。我認爲它會創建一個臨時對象來表示右側,然後使用複製構造函數將值複製到左側的對象。

我可能錯了,所以請檢查您的彙編列表。

+0

我相信編譯器將使用臨時對象調用複製構造函數,而不是調用賦值運算符。我認爲在性能方面的差異僅僅是創建臨時對象的開銷,我認爲在大多數情況下這種臨時對象並不重要。 – Nerdtron

+0

謝謝,我編輯了我的答案,將「=運算符」更改爲「複製構造函數」。 –

+0

在未優化的模式下,可能會出現copy-ctor調用。在優化模式下,可能不是。 – Macke

2

第一個只調用構造函數,而第二個只調用構造函數,然後將其複製到point。因此,您應該使用第一個,因爲它不啓動複製操作。

2

是的,它確實很重要。第一個版本Point2D point(1,2)將調用構造函數,而第二個Point2D point = Point2D(1,2)將首先創建一個新的Point2D(右邊一個),然後調用複製構造函數實際創建point。如您所見,這是C++和Java或C#之間的巨大差異。

2

大多數時候,返回值的優化將會使這兩個選項從性能的角度(特別是如果你有定義的舉動,賦值運算符)

還有其他的事情要考慮,雖然非常相似。

如果你的類型有一個空的構造,這樣做是有問題的:

Point2D p(); // instead of Point p; 

這就是所謂的Most Vexing Parse

Point2D p = Point2D(); 

,或者使用最新標準引入統一初始化語法

Point2D p{};