2012-01-05 30 views
1

12.1/5的構造方法是平凡的,如果它是一個隱式聲明的默認的構造,並且如果:使用一個簡單的構造的

- 其類沒有虛擬功能(10.3),並且沒有虛基 類( 10.1),並
- 所有的它的類的直接基類具有 無關緊要的構造函數,並
- 其 類的那些類型(或其陣列)的所有非靜態數據成員,每個這樣的類有一個 微不足道的構造函數。

首先,我認爲一個簡單的構造函數只是一個隱式的默認構造函數。但是當閱讀標準中的上述文本時,似乎微不足道的構造函數不僅是一個隱含的默認構造函數,而且還有其他一些要求,如上所述。這是什麼意思?有一個微不足道的構造函數有什麼意義?

例如:

class X 
{ 
    // ... 
}; 

確實類X有一個微不足道的或隱含的默認構造函數?

回答

2

這取決於// ...中的內容。

每個微不足道的構造函數都是一個隱式聲明的默認構造函數,但並不是每個隱式聲明的默認構造函數都是一個簡單的構造函數。 X類有一個微不足道的析構函數,如果有一個隱含的默認值,它的每個基類都有一個隱含的默認值(以及那些基類的基類等等),它的每一個成員或者是像int這樣的原始類型,或者是具有隱式默認類型(以及其成員的成員等等,以及其成員的基類和它們的基類,等等,以及它的基地成員,他們的成員等等等等)。

它可以更容易地看它的相反的方式:如果一個類具有微不足道的構造,則沒有類,它擴展它(「是-A」)或包含它(「具有-一個「)也有一個微不足道的構造函數。

1

微不足道的構造函數根本不做任何事情。從您的文章列表中說,一個構造函數是微不足道時:

  1. 你沒有讓你的構造提供了一個非默認構造函數的類
  2. 該基地並沒有使你的構造做的工作相關聯的做的工作與準備處理虛函數,虛基類,或者自己
  3. 類的數據成員的不平凡的構造並沒有使你的構造也與調用自己的不平凡的構造函數相關的工作

採取了這些規則一起表示構造函數無關,因此它是瑣碎

X情況下,這一切都取決於它的數據成員:如果他們都無關緊要的構造函數,如果你沒有自己提供一個不平凡的構造函數,X將有一個簡單的構造了。

+0

您能解釋一下構造函數如何與準備處理虛擬函數相關聯嗎? – user1086635 2012-01-05 03:54:03

+0

@ user1086635編譯器向帶有虛函數的類的佈局添加一個隱藏指針,指向虛函數表(也稱爲vtable)。這個指針需要在類可以使用之前設置。 – dasblinkenlight 2012-01-05 03:59:04

+0

但是在編譯時創建vtable,並且在創建對象時,隱藏的指針設置爲vtable。在這個過程中,構造函數在運行時永遠不會被調用,那麼它如何被使用? – user1086635 2012-01-05 06:14:13

相關問題