首頁 > 後端開發 > C++ > 主體

為什麼私有預設建構函式會阻止 C 中的物件創建,但支撐初始化卻可以運作?

Patricia Arquette
發布: 2024-11-12 20:39:02
原創
714 人瀏覽過

Why Does a Private Default Constructor Prevent Object Creation in C   But Braced Initialization Works?

什麼時候私有建構子不是私有建構子?

在 C 中,將建構子設為私有似乎是防止物件建立的直接方法課外。但是,當預設建構函數宣告為私有時,會出現意外行為。

考慮以下程式碼:

class C {
    C() = default;
};

int main() {
    C c; // Error: Private constructor
    auto c2 = C(); // Error: Private constructor
}
登入後複製

令人驚訝的是,由於私有預設建構函數,此程式碼無法編譯。然而,以下程式碼:

class C {
    C() = default;
};

int main() {
    C c{}; // Compiles
    auto c2 = C{}; // Compiles
}
登入後複製

編譯成功。

這種奇怪行為的原因在於 C 標準。根據 8.4.2/5 [dcl.fct.def.default],如果函數在其第一個聲明中明確默認,則函數不是用戶提供的。因此,在我們最初的範例中,預設建構函數不是使用者提供的。

缺乏使用者提供的建構子使得類別C 成為依照8.5.1/1 [dcl.init.aggr] 的聚合,其中:

  • 沒有使用者提供的建構子
  • 沒有私有或受保護的非靜態資料成員
  • 沒有基類
  • 沒有虛函數

對於聚合,花括號初始化語法被視為構造函數呼叫而不是聲明,這就是為什麼它在後一個程式碼片段中成功的原因。

以上是為什麼私有預設建構函式會阻止 C 中的物件創建,但支撐初始化卻可以運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板