c++ - why - std vector initializer list




如何在C++類的初始化列表中初始化member-struct? (2)

我在c ++中有以下類定義:

struct Foo {
  int x;
  char array[24];
  short* y;
};

class Bar {
  Bar();

  int x;
  Foo foo;
};

並且想要在Bar類的初始值設定項中將“foo”結構(及其所有成員)初始化為零。 可以這樣做:

Bar::Bar()
  : foo(),
    x(8) {
}

......?

或者foo(x)在初始化列表中的作用是什麼?

或者結構甚至從編譯器自動初始化為零?


在標準C ++中,你需要為Foo做一個ctor。

struct Foo {

  Foo(int const a, std::initializer_list<char> const b, short* c)
    : x(a), y(c) {
    assert(b.size() >= 24, "err");
    std::copy(b.begin(), b.begin() + 24, array);
  }

  ~Foo() { delete y; }

  int x;
  char array[24];
  short* y;
};

class Bar {

  Bar() : x(5), foo(5, {'a', 'b', ..., 'y', 'z'},
    new short(5)) { }

  private:

  int x;
  Foo foo;
};

在C ++ 0x中,您可以使用統一初始化列表,但仍然需要foo的dtor:

class Bar {

  Bar() : x(5), foo{5, new char[24]{'a', 'b', ..., 'y', 'z'},
    new short(5)} { }
  ~Bar() { delete[] foo.array; delete foo.y;}
  }
  private:

  int x;
  Foo foo;
};

要默認初始化foo (作為Bar() : foo(), x(8) { } ),你需要給Foo一個默認的ctor。


首先,你應該(必須!)閱讀關於POD和聚合的這個c ++ faq 。 在你的情況下, Foo確實是一個POD類, foo()是一個值初始化

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

  • 如果T是具有用戶聲明的構造函數(12.1)的類類型(第9節),則為默認構造函數
    for T被調用(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);
  • 如果T是沒有用戶聲明的構造函數的非聯合類類型,那麼T的每個非靜態數據成員和基類組件都是值初始化的;
  • 如果T是數組類型,那麼每個元素都是值初始化的;
  • 否則,該對像被零初始化

所以是的,foo將被零初始化。 請注意,如果從Bar構造函數中刪除了此初始化,則foo將僅默認初始化

如果沒有為對象指定初始化程序,並且該對像是(可能是cv限定的)非POD類類型(或其數組),則該對象應默認初始化; 如果對像是const限定類型,則底層類類型應具有用戶聲明的默認構造函數。 否則,如果沒有為非靜態對象指定初始化程序,則該對象及其子對象(如果有)具有不確定的初始值 ;





initializer