簡體   English   中英

“默認”構造函數是指“默認參數”還是“由 C++ 提供”?

[英]Does “default” constructor mean “default parameters” or “provided by C++”?

我對什么是“默認構造函數”感到困惑,因為我從我的 class 和在線都得到了兩個含義。

1)我們自己寫了一個構造函數,但是我們將參數設置為默認值。

2)我們根本沒有編寫任何構造,但我們仍然可以像我們一樣“假裝”並使用 C++ “提供的構造函數”初始化 class 的實例

如果情況是#2,初始化時會發生什么? 垃圾價值觀?

謝謝!

[class.ctor]/4

class X默認構造函數是 class X的構造函數,其中每個不是 function 參數包的參數都有一個默認參數(包括沒有參數的構造函數的情況)。 如果 class X沒有用戶聲明的構造函數,則將不帶參數的非顯式構造函數隱式聲明為默認構造函數 ([dcl.fct.def])。 隱式聲明的默認構造函數是其 class 的inline public成員。

如果您不提供任何構造函數,那么 C++ 將合成一個(可能已刪除)默認構造函數。 此合成構造函數的語義在[class.ctor]/7中指定:

默認構造函數默認且未定義為已刪除的默認構造函數在用於創建其 class 類型 ([intro.object]) 的 object 或在其第一次聲明后顯式默認時被隱式定義 隱式定義的默認構造函數執行 class 的一組初始化,這將由用戶編寫的 class 的默認構造函數執行,沒有ctor-initializer和一個空的復合語句 如果該用戶編寫的默認構造函數格式不正確,則程序格式錯誤。 如果該用戶編寫的默認構造函數滿足 constexpr 構造函數的要求,則隱式定義的默認構造函數是constexpr 在隱式定義 class 的默認默認構造函數之前,應隱式定義其基類及其非靜態數據成員的所有非用戶提供的默認構造函數。 [注意:隱式聲明的默認構造函數具有異常規范([except.spec])。 顯式默認定義可能具有隱式異常規范,請參閱 [dcl.fct.def]。 ——尾注]

因此,是的,數據成員將在沒有類內成員初始化器的情況下默認初始化。 這會使內置類型的成員未初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM