C++ C++;用两种不同的方式从类实例化对象

C++ C++;用两种不同的方式从类实例化对象,c++,object,constructor,instantiation,C++,Object,Constructor,Instantiation,我很确定以前有人问过这个问题,但我一生都无法通过搜索找到它 下面是: 这两者之间的区别是什么: MyObj myObj; 及 我相信两者都能达到同样的效果,但其中一个比另一个更好吗?假设我想要的是默认构造函数 *编辑-我听说第一种方法更合适,因为第二种方法首先通过默认构造函数创建对象,然后对myObj进行赋值。第一个没有“分配”操作,因此第一个将“更快”。真相?前者是一种声明,后者是一种初始化 如果MyObj不是POD,那么除了副本构造函数必须存在并且在后一种情况下可以访问(即使它没有被调用)

我很确定以前有人问过这个问题,但我一生都无法通过搜索找到它

下面是:

这两者之间的区别是什么:

MyObj myObj;

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


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

前者是一种声明,后者是一种初始化

如果MyObj不是POD,那么除了副本构造函数必须存在并且在后一种情况下可以访问(即使它没有被调用)之外,实际上没有什么区别


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

是的,可能存在差异

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

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

如果
MyObj
有一个构造函数,那么将始终调用构造函数。对于第一种情况,默认构造函数必须是可访问的,对于第二种情况,副本构造函数和默认构造函数都必须是可访问的,尽管只能调用默认构造函数


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

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

您没有查阅标准。但是第二个不是声明和初始化吗?它们都是声明,因为每个定义都是声明,而且都是定义。这个答案的第二段与Charles答案的最后一句相矛盾(这说明没有区别,Charles说如果默认构造函数是编译器生成的,那么就有区别)。对于C++03,Charles是对的。在C++98中,它们都是默认构造的。类似但不完全相同:
MyObj myObj = MyObj();