為什麼C 需要使用者提供的建構子來預設初始化常數物件
C 標準規定,當預設初始化a 的物件時const 限定類型,該類型必須具有使用者提供的預設建構函數。這項要求是由於 C 中 POD(普通舊資料)概念和物件初始化之間的相互作用而產生的。
在 C 中,預設會初始化非 POD 類別的物件。但是,POD 是沒有建構函數、驗證器或析構函數的輕量級資料類型,預設不會初始化。這是因為 POD 是為效能敏感的場景而設計的,在這些場景中,明確初始化效率更高。
初始化 const 限定類型的物件時,標準要求使用使用者提供的建構子來確保物件可以已初始化。這是必要的,因為如果底層類別是沒有建構函數的 POD,則該物件將保持未初始化狀態,使其無用。
考慮範例程式碼:
struct B { B() : x(42) {} int doSomeStuff() const { return x; } int x; }; struct A { A() {} // Why is this required? B b; // Just for illustration }; int main() { const A a; }
在此程式碼中,物件 a 是 const 限定的。如果 A 類別沒有使用者提供的建構函數,它將被視為 POD。由於 POD 預設未初始化,因此 a 將未初始化,從而使程式碼無效。
但是,A 類別確實有一個使用者提供的建構函數,這使其成為非 POD。因此,a 透過呼叫構造函數進行預設初始化,程式碼編譯成功。
標準對使用者提供的建構子的要求是為了確保 const 限定型別的物件可以正確初始化和使用.
以上是為什麼 C 中的 Const 物件需要使用者定義的預設建構函式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!