簡體   English   中英

c ++結構是否有默認構造函數?

[英]Does a c++ struct have a default constructor?

我寫了以下代碼片段:

void foo()
{
    struct _bar_ 
    {
        int a;
    } bar; 

    cout << "Value of a is " << bar.a;
}

並用g ++ 4.2.1(Mac)編譯它。 輸出為“a的值為0”。

是否真的說c ++中的結構的數據成員默認是初始化的(與c相比)? 或者觀察到的結果是巧合嗎?

我可以想象c ++中的結構有一個默認構造函數(因為結構和類在c ++中幾乎相同),這可以解釋為什么bar的數據成員a初始化為零。

簡單的答案是肯定的。
它有一個默認的構造函數。

注意:struct和class是相同的(除了訪問說明符的默認狀態)。

但它是否初始化成員將取決於實際對象的聲明方式。 在您的示例中,沒有成員未初始化且具有不確定的值。

void func()
{
    _bar_  a;                 // Members are NOT initialized.
    _bar_  b = _bar_();       // Members are zero-initialized
    // From C++14
    _bar_  c{};               // New Brace initializer (Members are zero-initialized)


    _bar_* aP = new _bar_;    // Members are NOT initialized.
    _bar_* bP = new _bar_();  // Members are zero-initialized
    // From C++14
    _bar_  cP = new _bar_{};  // New Brace initializer (Members are zero-initialized)
}

// static storage duration objects
//   i.e. objects at the global scope.
_bar_ c; // Members are zero-initialized.

具體細節在8.5 Initializers [dcl.init]第4-10段的標准中解釋。 但以下是對這種情況的簡單總結。

沒有用戶定義構造函數的結構具有編譯器生成的構造函數。 但它的作用取決於它是如何使用的,它將默認初始化其成員(對於POD類型通常沒有)或者它可能零初始化其成員(對於POD通常意味着將其成員設置為零)。

PS。 不要使用_作為類型名稱中的第一個字符。 你會碰到問題。

是否真的說c ++中的結構的數據成員默認是初始化的(與c相比)? 或者觀察到的結果是巧合嗎?

這是巧合。

您的代碼調用未定義的行為; 除非您明確將成員設置為0否則它們可以是任何內容。

不是答案,但你可能會認為......如果你想嘗試一下:

void foo() {
   struct test {
      int value;
   } x;
   std::cout << x.value << std::endl;
   x.value = 1000;
}
int main() {
   foo();
   foo();
}

在您的示例中,內存在創建變量之前已經具有0值,因此您可以將其稱為幸運巧合 (事實上​​,某些操作系統會在啟動進程之前將所有內存清零,這意味着0很可能是值在一個小的短程序中查找...),前面的代碼將調用該函數兩次,並且第一次調用的內存將在第二次調用中重用,可能是第二次調用它將打印1000.但是請注意該值仍未定義,並且此測試可能顯示或未顯示預期結果(即編譯器可以執行許多操作並生成不同的結果...)

默認情況下,不初始化結構的成員變量。 就像一個類(因為結構與類完全相同,只有在結構中,成員默認是公共的)。

不要依賴這個功能它是非標准的

加上

foo() : a() {}

我不記得gcc 4.2的確切狀態(我認為它太舊了)但是如果你使用C ++ 11你可以做以下事情

foo()=default;

暫無
暫無

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

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