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

问题描述:

我很确定这已经被问过了,但是我不能通过搜索找到它。C++通过两种不同的方式从类中实例化一个对象

所以这里有云:

有什么区别:

MyObj myObj = MyObj(); 

MyObj myObj; 

相信无论达到同样的效果,而且是一个比其他使用?假设我想要的只是默认的构造函数。

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

+0

类似但不完全相同:http:// stackoverflow。com/questions/1581763/a-pa-new-a-a-pa-new-a – 2010-12-21 23:10:47

是的,可以有区别。

第一种情况下,myObj如果是POD类型,则不初始化,否则默认初始化为

在第二个实例是myObj拷贝初始化从值初始化临时。临时可能(并且几乎可以肯定应该)被取消以产生值初始化

如果MyObj有一个构造函数,那么总是会调用一个构造函数。对于第一种情况,默认构造函数必须是可访问的,第二种情况下,复制构造函数和默认构造函数都必须是可访问的,尽管只有默认构造函数可能会被调用。

除了与“未初始化”和值初始化 POD的类型,有之间的差异的显着性差异默认初始化值初始化没有用户非POD类型定义的构造函数。对于这些类型,POD成员不初始化为默认初始化,但零初始化值初始化的父类。

前者是声明,后者是初始化。

如果MyObj不是POD,那么除了复制构造函数必须存在并且在后一种情况下可以访问(即使未被调用)之外,真的没有区别。

如果MyObj是POD,那么前者不会初始化它,MyObj成员变量的内容将是未指定的。后者是“零”初始化非聚合POD的唯一方法。

+0

没有查找标准。但第二个不会是“声明和初始化”。 – 2010-12-21 23:08:36

没有太多解释 - 第一个使用默认构造函数来初始化myObj。第二个实际创建一个临时实例,然后使用复制构造函数初始化myObj。 (请记住,还会创建一个默认的拷贝构造函数,而不仅仅是一个默认构造函数)