我很确定以前曾经问过这个问题,但我不能通过搜索找到它。
所以这就是:
有什么区别:
MyObj myObj;
和
MyObj myObj = MyObj();
我相信两者都能达到相同的效果,但是使用它比另一种更好吗?假设我想要的只是默认构造函数。
*编辑 - 我听说第一个更合适,因为第二个首先通过默认构造函数创建一个对象,然后分配给myObj。第一个没有“分配”操作,因此第一个将“更快”。真相?
答案 0 :(得分:9)
是的,可能会有所不同。
在第一个实例中,myObj
如果是POD类型则不会初始化,否则默认初始化。
在第二个实例中myObj
是值初始化临时的复制初始化。临时可能(并且几乎肯定应该)被删除以使效果值初始化。
如果MyObj
有构造函数,那么将始终调用构造函数。对于第一种情况,必须可以访问默认构造函数,对于第二种情况,必须可以访问复制和默认构造函数,尽管只能调用默认构造函数。
除了POD类型的“未初始化”和值初始化之间存在明显差异外,默认初始化和值之间存在差异 - 没有用户定义的构造函数的非POD类型的初始化。对于这些类型,POD成员不会在 default-initialization 中初始化,而是在父类的 value-initialization 中零初始化。
答案 1 :(得分:4)
前者是声明,后者是初始化。
如果MyObj不是POD,那么除了复制构造函数必须存在并且在后一种情况下可以访问(即使它没有被调用)之外,实际上没有区别。
如果MyObj是POD,那么前者不会初始化它,MyObj成员变量的内容将是未指定的。后者是“零”初始化非聚合POD的唯一方法。
答案 2 :(得分:0)
没有多少解释 - 第一个使用默认构造函数来初始化myObj。第二个实际创建一个临时实例,然后使用复制构造函数初始化myObj。 (请记住,还会创建默认的复制构造函数,而不仅仅是默认的构造函数)