簡體   English   中英

隱式與顯式默認構造函數調用

[英]Implicit vs. Explicit Default Constructor Call

假設我對以下用於創建調用默認構造函數(由編譯器提供)的對象的方法的了解是正確的。

class A
{
    int a,b;
    //No programmer defined constructor
}
...
A o1; //Implicit Call I believe
A o2 = A(); //Explicit Call

為什么A o2 = A(); 導致對象o2的成員 (a,b) 使用默認值 (0) 而不是A o;初始化自身A o; (它們是用垃圾值初始化的)? 這是未定義的行為嗎?

引用來自標准 p8.5/1

這里沒有用戶定義的構造函數,所以編譯器會使用默認的構造函數。 並且默認構造函數不會用零初始化成員。

如果沒有為對象指定初始化程序,則該對象是默認初始化的。

默認初始化 T 類型的對象意味着:

如果 T 是(可能是 cv 限定的)類類型(第 9 條),則考慮構造函數。 枚舉適用的構造函數(13.3.1.3),並通過重載決議(13.3)為初始化器()選擇最好的一個。 如此選擇的構造函數被調用,參數列表為空,以初始化對象。

在第二種情況下將是值初始化。

初始值設定項為空括號集的對象,即 (),應進行值初始化。

對 T 類型的對象進行值初始化意味着:

如果 T 是(可能是 cv 限定的)類類型而沒有用戶提供或刪除的默認構造函數,則對象被零初始化並檢查默認初始化的語義約束,並且如果 T 具有非平凡的默認構造函數, 對象是默認初始化的;

對 T 類型的對象或引用進行零初始化意味着:

如果 T 是(可能是 cv 限定的)非聯合類類型,則每個非靜態數據成員和每個基類子對象都被零初始化,填充被初始化為零位;

在這兩種情況下,都會調用編譯器提供的默認構造函數。 最有可能的 C++ 編譯器將值初始化為一些垃圾值。 在調用默認構造函數的情況下,c++ 編譯器不會將該值初始化為 0,除非內存已被轉儲為零。 我試過這種情況,我沒有看到在兩個對象中為 a 和 b 分配的值有任何差異。

暫無
暫無

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

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