在 C++ 中,以下两种动态对象创建之间的确切区别是什么:
A* pA = new A;
A* pA = new A();
我做了一些测试,但似乎在这两种情况下,都调用了默认构造函数,并且只调用了它。我正在寻找有关性能的任何差异...
谢谢
最佳答案
如果 A
是 POD 类型,则 new A
将分配一个新的 A
对象,但保留一个不确定的值,否则new A
将默认初始化新对象。
在所有情况下,new A()
都会初始化新的A
对象。
对于 POD 类型,这显然是不同的行为,但也会影响非 POD、非 union 类类型,而无需使用已声明的构造函数。
例如
struct A
{
int a;
std::string s;
};
A
是一种非 POD 类类型,没有用户声明的构造函数。当 A
被 默认初始化 时,会调用隐式定义的构造函数,该构造函数会调用 s
(非 POD 类型)的默认构造函数,但是 a
未初始化。
当一个A
被值初始化,因为它没有使用声明的构造函数,它的所有成员都是值初始化,这意味着s
的默认构造函数被调用并且 a
被零初始化。
ISO 14882:2003 引用:
5.3.4 [expr.new]/15:由
new
表达式分配的对象如何根据初始化器是否省略、一对括号或其他方式进行初始化。8.5 [dcl.init]/5:零初始化、默认初始化和值初始化的含义。 p>
12.1 [class.ctor]/7,8:用户编写的构造函数的形式,与隐式定义的默认构造函数的行为相匹配。
12.6.2 [class.base.init]/4:未列在构造函数的成员初始化器列表中的基类和成员如何初始化。
关于c++ - A* pA = 新 A 之间的差异;和 A* pA = 新 A();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581763/