C++类的初始化:带括号和不带括号的区别

8
以下两种初始化方式有什么区别?

int a = 0;

int b(0);

class Pod {
public:
    int a, b;
};

Pod *p1 = new Pod;
Pod *p2 = new Pod();

正如JamesMcLaughlin所说,没有区别,而且这不仅限于POD。 - MFH
@DavidRodríguez-dribeas 怎么了? - James M
@JamesMcLaughlin:请阅读标准中的第8.5节 :) - David Rodríguez - dribeas
@DavidRodríguez-dribeas 嗯,看起来我错了!谢谢。 - James M
1
这个之前的帖子解释了零、默认和值初始化,并提供了示例:https://dev59.com/aXI-5IYBdhLWcg3w6tFR - Shafik Yaghmour
这类似于“最令人烦恼的解析”,https://dev59.com/HXVC5IYBdhLWcg3wz0h9 请参见http://ideone.com/ompWis - QuentinUK
1个回答

11
在第一种情况下,对象未初始化,而在第二种情况下,对象保证是值初始化的,由于类型是POD,这意味着零初始化

1
虽然在int的情况下本质上没有区别,但在第一种情况下,成员被默认初始化而不是未初始化。 - Jerry Coffin
@JerryCoffin:是的,我应该表述得更清楚,这部分也是由于它是POD类型,因为默认初始化意味着对象被保留未初始化状态 - David Rodríguez - dribeas
1
@DavidRodríguez-dribeas:但是在C++11中,它也不仅限于POD类型(如果我没记错的话,应该适用于更广泛的所有可平凡复制类型)。 - Jerry Coffin
@JerryCoffin: “可平凡复制类型”?不确定这在这里有什么作用(任何地方都没有副本),我找不到n3777中支持它的参考。对于“值初始化”,区别在于具有/不具有用户提供的默认构造函数的类类型。对于类类型的“默认初始化”,它意味着调用默认构造函数,如果隐式定义将递归地导致成员的“默认初始化”...最终基本类型的成员保持未初始化状态。 - David Rodríguez - dribeas
1
@DavidRodríguez-dribeas:复制并不是非常重要的,但是能够轻松复制是比POD更宽松的要求,而且你不必满足成为POD所需的额外要求,以使默认初始化意味着保持未初始化。 - Jerry Coffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接