C++以两种不同的方式从类中实例化一个对象

Nic*_*ick 9 c++ constructor object instantiation

我很确定之前曾经问过这个问题,但我不能通过搜索找到它.

所以这里:

有什么区别:

MyObj myObj;
Run Code Online (Sandbox Code Playgroud)

MyObj myObj = MyObj();
Run Code Online (Sandbox Code Playgroud)

我相信两者都能达到相同的效果,但是比另一种更好用吗?假设我想要的只是默认构造函数.

*编辑 - 我听说第一个更合适,因为第二个首先通过默认构造函数创建一个对象,然后分配给myObj.第一个没有"分配"操作,因此第一个将"更快".真相?

CB *_*ley 9

是的,可能会有所不同.

在第一个实例中,myObj如果它是POD类型则不会被初始化,否则它是默认初始化的.

在第二个实例myObj中,从值初始化的临时值进行复制初始化.临时可能(并且几乎肯定应该)被删除以进行效果值初始化.

如果MyObj有一个构造函数,那么将始终调用构造函数.对于第一种情况,必须可以访问默认构造函数,对于第二种情况,必须可以访问复制和默认构造函数,尽管只能调用默认构造函数.

除了POD类型的"未初始化"和值初始化之间的明显差异之外,对于没有用户定义的构造函数的非POD类型,默认初始化值初始化之间存在差异.对于这些类型,POD成员不会在默认初始化中初始化,而是在父类的初始化零初始化.