簡體   English   中英

C++ 為什么成員沒有默認初始化?

[英]C++ Why the members are not default initialized?

如果我有一個 struct Foo 和一個 struct Bar:

struct Foo {
  int a, b;
};

struct Bar {
  Foo foo;  
  int c;
};

如果我初始化一個Bar並打印我正確得到的值:

int main() {
  Bar bar = {}; // I call the default constructor
  std::cout << bar.foo.a << " "; // 0
  std::cout << bar.foo.b << " "; // 0
  std::cout << bar.c << std::endl; // 0

  return 0;
}

但是現在如果我聲明一個這樣的構造函數:

struct Bar {
  Bar() : c(5) {}

  Foo foo;  
  int c;
};

我失去了Bar::foo的默認構造,程序輸出32764 0 5

為什么我不得不像這樣愚蠢地初始化每個成員變量:

struct Bar {
  Bar() : c(5) {}

  Foo foo{};  
  int c;
};

只要我聲明一個構造函數? 為什么在這種情況下默認構造不起作用?

在 C++ 中,如果您有一個默認構造函數,並且變量沒有使用初始化列表進行初始化,那么它默認構造為一個不確定的值。 這是一個尚未修復的值得注意的行為,所以我認為它要么是有意的,要么更有可能被接受。

來自CPP 參考

筆記

具有自動和動態存儲持續時間的非類變量的默認初始化產生具有不確定值的對象(靜態和線程局部對象初始化為零)

引用和 const 標量對象不能默認初始化。

暫無
暫無

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

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