簡體   English   中英

為什么對象默認初始化但基元不在 C++ 中?

[英]Why are objects default initialized but primitives aren't in C++?

為什么基元沒有默認初始化,但對象在 C++ 中? 例如:

class Foo {
  void Method() {
    int w(); // initialized to 0
    int x; // uninitialized
    std::vector<int> y(); // initialized to empty vector
    std::vector<int> z; // initialized to empty vector
  }
}

在這種情況下, wy是用括號聲明的,因此被初始化, z是沒有聲明的,並且調用了它的無參數默認構造函數,但x保持未初始化。 為什么是這樣?

如果對象沒有初始化器,則對象默認初始化為[dcl.init]/12 如果初始化器是() ,則對象是值初始化的[dcl.init]/11 類類型對象(如std::vector<int> )的默認初始化調用默認構造函數,而int類型對象的默認初始化意味着沒有初始化[dcl.init]/7 值初始化還將為具有 1 的類類型對象調用默認構造函數(如std::vector<int>所做的那樣),但對於int類型的對象,值初始化意味着零初始化[dcl.init]/8 int零初始化實際上意味着int被初始化為零[dcl.init]/6 ...

正如評論中已經指出的那樣,

int w();

std::vector<int> y();

實際上不是局部變量的定義,而是兩個函數wy聲明,它們不帶參數並分別返回一個int和一個std::vector<int> (臭名昭著的最令人煩惱的 parse )。 盡管如此,在某些情況下可以使用()作為實際的初始化程序,因此讓我們稍微修改一下您的示例以演示您所詢問的行為:

class Foo
{
    int w;
    std::vector<int> y;

    Foo()
      : w(),  // value initialized == zero initialized for int
        y()   // value initialized == default initialized for std::vector<int>
    {
        int x; // default initialized == uninitialized for int
        std::vector<int> z; // default initialized
    }
};

這里的“為什么”簡化為“因為 C++ 試圖盡可能保持 C 的性能和行為兼容”。 當您銷售一種新的、相對低級的語言(至少最初)主要是 C 的超集時,您不會想說“如果您將現有的 C 代碼編譯為 C++,它總是更慢!” 默認情況下,C 不會對原語進行零初始化; 只要代碼最終在讀取它們之前為它們分配一個值,那很好,C++ 遵循相同的模式。

暫無
暫無

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

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