gpt4 book ai didi

c++ - A* pA = 新 A 之间的差异;和 A* pA = 新 A();

转载 作者:IT老高 更新时间:2023-10-28 21:45:59 29 4
gpt4 key购买 nike

在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com