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

时间:2010-12-21 22:53:52

标签: c++ object constructor instantiation

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

所以这就是:

有什么区别:

MyObj myObj;

MyObj myObj = MyObj();

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

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

3 个答案:

答案 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。 (请记住,还会创建默认的复制构造函数,而不仅仅是默认的构造函数)