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

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

问题描述:

我在C++以下类定义:如何在C++类的初始化程序列表中初始化member-struct?

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

class Bar { 
    Bar(); 

    int x; 
    Foo foo; 
}; 

,并想在酒吧类的初始化初始化“foo”的结构(及其所有成员)为零。可以这样做:

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

...?

或者foo(x)在初始化程序列表中做了什么?

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

+3

请注意,成员应该按照与声明相同的顺序在初始化列表中列出,而您首先声明'x',但在初始化列表中第二个声明它。 – 2010-11-17 09:52:55

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

要值初始化 类型的物体T是指:

  • 如果T是一个类类型( (12.1),然后调用T的默认构造函数
    (如果T没有可访问的默认构造函数,则初始化是格式错误的)。
  • 如果T是一个没有用户声明构造函数的非联合类类型,那么T中的每个非静态数据成员和基类组件都进行了值初始化;
  • 如果T是一个数组类型,则每个元素都进行了值初始化;
  • 否则,对象初始化为零

所以,是的,foo将被初始化为零。需要注意的是,如果你从Bar构造去掉这个初始化,foo只会默认初始化

如果一个 对象没有指定初始化,并且对象是(可能 CV-合格)非-POD类型(或其中的 ),对象应为 默认初始化;如果对象为const限定类型的 ,则基础类类型应具有用户声明的默认构造函数 。 否则,如果没有初始化为非静态对象,该 对象及其子对象指定 ,如果有的话, 具有一个不确定的初始值 ;

+2

如果foo被定义为const成员? – RezaPlusPlus 2011-09-09 21:41:26

在标准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的析构函数:

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) { }),你需要给富默认构造函数。

+2

这是有点不清楚你在哪里使用C++ 03 vs C++ 0x。 IIRC'initializer_list'是C++ 0x的一部分。除了你的第二个codeblock,你还创建了两个内存泄漏。 – 2010-11-17 10:14:25

+0

@Fabio:谢谢你指出,编辑 – erjot 2010-11-17 13:31:59

+0

现在你有一个双重删除('foo.y')和一个内存泄漏(来自'new char [24]',另外,我不确定(但我可能会这里是错误的),这是使用'initializer_list'的方式) – 2010-11-17 19:03:17