我很確定這已經被問過了,但是我不能通過搜索找到它。C++通過兩種不同的方式從類中實例化一個對象
所以這裏有雲:
有什麼區別:
MyObj myObj = MyObj();
MyObj myObj;
和
相信無論達到同樣的效果,而且是一個比其他使用?假設我想要的只是默認的構造函數。*編輯 - 我聽說第一個更合適,因爲第二個先通過默認構造函數創建一個對象,然後分配給myObj。第一個沒有「分配」操作,所以第一個將是「更快」。真相?
我很確定這已經被問過了,但是我不能通過搜索找到它。C++通過兩種不同的方式從類中實例化一個對象
所以這裏有雲:
有什麼區別:
MyObj myObj = MyObj();
MyObj myObj;
和
相信無論達到同樣的效果,而且是一個比其他使用?假設我想要的只是默認的構造函數。*編輯 - 我聽說第一個更合適,因爲第二個先通過默認構造函數創建一個對象,然後分配給myObj。第一個沒有「分配」操作,所以第一個將是「更快」。真相?
是的,可以有區別。
第一種情況下,myObj
如果是POD類型,則不初始化,否則默認初始化爲。
在第二個實例是myObj
拷貝初始化從值初始化臨時。臨時可能(並且幾乎可以肯定應該)被取消以產生值初始化。
如果MyObj
有一個構造函數,那麼總是會調用一個構造函數。對於第一種情況,默認構造函數必須是可訪問的,第二種情況下,複製構造函數和默認構造函數都必須是可訪問的,儘管只有默認構造函數可能會被調用。
除了與「未初始化」和值初始化 POD的類型,有之間的差異的顯着性差異默認初始化和值初始化沒有用戶非POD類型定義的構造函數。對於這些類型,POD成員不初始化爲默認初始化,但零初始化值初始化的父類。
前者是聲明,後者是初始化。
如果MyObj不是POD,那麼除了複製構造函數必須存在並且在後一種情況下可以訪問(即使未被調用)之外,真的沒有區別。
如果MyObj是POD,那麼前者不會初始化它,MyObj成員變量的內容將是未指定的。後者是「零」初始化非聚合POD的唯一方法。
沒有查找標準。但第二個不會是「聲明和初始化」。 – 2010-12-21 23:08:36
沒有太多解釋 - 第一個使用默認構造函數來初始化myObj。第二個實際創建一個臨時實例,然後使用複製構造函數初始化myObj。 (請記住,還會創建一個默認的拷貝構造函數,而不僅僅是一個默認構造函數)
類似但不完全相同:http:// stackoverflow。com/questions/1581763/a-pa-new-a-a-pa-new-a – 2010-12-21 23:10:47