2015-01-02 18 views
5

這打印0,意思是data是零初始化。爲什麼在base有用戶聲明的構造函數時會發生這種情況?即使base有用戶聲明的構造函數,爲什麼零初始化會發生?

struct base 
{ 
    base() { } 
    int data; 
}; 

struct derived : base 
{ 
    derived() = default; 
}; 

int main() 
{ 
    std::cout << derived().data; 
} 

如果derived有一個用戶聲明的構造函數,那麼它打印出一個隨機值。爲什麼零初始化依賴於派生類而不是基類?

+3

它不會發生。 UB有許多可能的結果,0只是其中之一。 –

+0

最好完全避免這個問題,並提供一個構造函數初始化列表IMO。 – Conduit

+0

僅供參考,在'default'和'#include ' – Cornstalks

回答

11

規則被明確寫入覆蓋

struct S { 
    int i; 
    std::string s; 
}; 

其中沒有任何用戶提供的構造,即使隱式生成默認的構造是不平凡的,S().i將是零初始化。這不能取決於int的構造函數,因爲int沒有任何構造函數。決定讓它取決於類S是否有用戶提供的構造函數。沒有其他可以依賴的其他東西了。

你看到的是一個簡單的結果。您的類derived也沒有用戶提供的構造函數,所以它也得到零初始化。

+3

事實上,將'derived'構造函數改爲'derived():base(){}'(即使其成爲用戶提供的構造函數)會導致未初始化的'data'成員。 – Cornstalks

相關問題