2010-12-21 40 views
8

我很確定這已經被問過了,但是我不能通過搜索找到它。C++通過兩種不同的方式從類中實例化一個對象

所以這裏有雲:

有什麼區別:

MyObj myObj = MyObj(); 

MyObj myObj; 

相信無論達到同樣的效果,而且是一個比其他使用?假設我想要的只是默認的構造函數。

*編輯 - 我聽說第一個更合適,因爲第二個先通過默認構造函數創建一個對象,然後分配給myObj。第一個沒有「分配」操作,所以第一個將是「更快」。真相?

+0

類似但不完全相同:http:// stackoverflow。com/questions/1581763/a-pa-new-a-a-pa-new-a – 2010-12-21 23:10:47

回答

9

是的,可以有區別。

第一種情況下,myObj如果是POD類型,則不初始化,否則默認初始化爲

在第二個實例是myObj拷貝初始化從值初始化臨時。臨時可能(並且幾乎可以肯定應該)被取消以產生值初始化

如果MyObj有一個構造函數,那麼總是會調用一個構造函數。對於第一種情況,默認構造函數必須是可訪問的,第二種情況下,複製構造函數和默認構造函數都必須是可訪問的,儘管只有默認構造函數可能會被調用。

除了與「未初始化」和值初始化 POD的類型,有之間的差異的顯着性差異默認初始化值初始化沒有用戶非POD類型定義的構造函數。對於這些類型,POD成員不初始化爲默認初始化,但零初始化值初始化的父類。

4

前者是聲明,後者是初始化。

如果MyObj不是POD,那麼除了複製構造函數必須存在並且在後一種情況下可以訪問(即使未被調用)之外,真的沒有區別。

如果MyObj是POD,那麼前者不會初始化它,MyObj成員變量的內容將是未指定的。後者是「零」初始化非聚合POD的唯一方法。

+0

沒有查找標準。但第二個不會是「聲明和初始化」。 – 2010-12-21 23:08:36

0

沒有太多解釋 - 第一個使用默認構造函數來初始化myObj。第二個實際創建一個臨時實例,然後使用複製構造函數初始化myObj。 (請記住,還會創建一個默認的拷貝構造函數,而不僅僅是一個默認構造函數)

相關問題