使用()的POD成员类型的构造函数初始化列表

时间:2013-12-30 23:42:45

标签: c++ c++11

以下是我编写的示例代码,以帮助我解决问题:

class test {
    public:
        test(int x, int y) :  _x(x), _y() {}

    private:
        int _x, _y;
};

对于POD(普通数据类型),_y()(空括号)是否有效?如果是这样,_y被初始化为什么?如果没有效果,列表中_y()是否效率低。

谢谢你, 艾哈迈德。

2 个答案:

答案 0 :(得分:3)

成员初始值设定项_y()的效果为value initialization,并将_y初始化为零。

答案 1 :(得分:2)

构造函数初始化列表执行直接初始化(C ++11§12.6.2/ 7):

  

mem-initializer中的expression-list或braced-init-list用于初始化指定的子对象...根据8.5的初始化规则进行直接初始化。

初始化规则声明()将值初始化对象(§8.5/ 16):

  

如果初始值设定项为(),则对象进行值初始化。

对POD类型进行值初始化是对其进行零初始化,这意味着将其值或其子对象的值设置为0(§8.5/ 5):

  

对T类型的对象进行值初始化意味着:

     
      
  • 如果T是一个(可能是cv限定的)类类型(第9条),带有用户提供的构造函数(12.1), [...不是POD]

  •   
  • 如果T是一个(可能是cv限定的)非联合类类型而没有用户提供的构造函数,那么该对象   是零初始化,如果T的隐式声明默认构造函数是非平凡的, [...不是POD]

  •   
  • 如果T是数组类型,则每个元素都是值初始化的;

  •   
  • 否则,该对象为零初始化。

  •   

在数组类型的情况下,如果它的元素是POD类型,它只是一个POD类型,所以它们最终被零初始化。