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

标签 c++

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

相关文章:

c# - 缓入缓出动画公式

c++ - 反卷积 C++

c++ - 检查枚举类是否包含特定标识符

c++ - 将 std::runtime_error 捕获为 std::exception 时出错

c++ - 我的 4 个字节去哪儿了?

c++ - 什么是 Windows 工具包以及它们如何工作?

c++ - 函数指针错误

c++ - 如何实现用于配置功能的通用 C++?

c++ - 信号处理程序和库工作线程

c++ - 在 OS X 上安装 Boost 1.48.0