如何在C ++类的初始化列表中初始化member-struct?

时间:2010-11-17 09:23:32

标签: c++ list constructor struct initializer

我在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)在初始化列表中的确切作用是什么?

或者结构甚至从编译器自动初始化为零?

2 个答案:

答案 0 :(得分:50)

首先,您应该(必须!)阅读有关POD和聚合的c++ faq。在您的情况下,Foo确实是POD类,foo()值初始化

  

对值类型的对象进行值初始化   T表示:

     
      
  • 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则默认构造函数为   for T被调用(如果T没有可访问的默认构造函数,则初始化是错误的形式);
  •   
  • 如果T是没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;
  •   
  • 如果T是数组类型,则每个元素都是值初始化的;
  •   
  • 否则,该对象为零初始化
  •   

所以是的,foo将被零初始化。请注意,如果您从Bar构造函数中删除了此初始化,则foo只会默认初始化

  

如果没有为a指定初始值设定项   对象,对象是(可能是   cv-qualified)非POD类类型(或   对象应该是   默认初始化;如果对象是   const限定类型,   基础类型应具有   用户声明的默认构造函数。   否则,如果没有初始化程序   为非静态对象指定的   对象及其子对象(如果有)   有一个不确定的首字母   值

答案 1 :(得分:8)

在标准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。