以下是我编写的示例代码,以帮助我解决问题:
class test {
public:
test(int x, int y) : _x(x), _y() {}
private:
int _x, _y;
};
对于POD(普通数据类型),_y()
(空括号)是否有效?如果是这样,_y被初始化为什么?如果没有效果,列表中_y()
是否效率低。
谢谢你, 艾哈迈德。
答案 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类型,所以它们最终被零初始化。