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

Mat*_*ieu 21 c++

在C++中,以下两个动态对象创建之间的确切区别是什么:

A* pA = new A;

A* pA = new A(); 
Run Code Online (Sandbox Code Playgroud)

我做了一些测试,但似乎在两种情况下,默认构造函数都被调用,只有它.我正在寻找有关性能的任何不同......

谢谢

CB *_*ley 38

如果A是POD类型,那么new A将分配一个新A对象,但保留一个不确定的值,否则new A默认初始化新对象.

在所有情况下,new A()初始化A对象的.

对于POD类型,这显然是不同的行为,但是也会影响非POD,非联合类类型而没有使用声明的构造函数.

例如

struct A
{
    int a;
    std::string s;
};
Run Code Online (Sandbox Code Playgroud)

A是没有用户声明的构造函数的非POD类类型.当A默认初始化隐含定义构造函数被调用这就要求默认构造函数s(非POD类型),但a没有初始化.

当一个A值初始化,因为它没有使用-声明的构造,它的所有成员都是值初始化,这意味着默认的构造函数s被调用,a初始化为零.

ISO 14882:2003参考:

  • 5.3.4 [expr.new]/15:如何new初始化表达式分配的对象,具体取决于是否省略了初始化程序,一对括号或其他方法.

  • 8.5 [dcl.init]/5:零初始化,默认初始化值初始化的含义.

  • 12.1 [class.ctor]/7,8:用户编写的构造函数的形式,它与隐式定义的默认构造函数的行为相匹配.

  • 12.6.2 [class.base.init]/4:如何初始化未在构造函数的成员初始值设定项列表中列出的基数和成员.

  • 请注意,修订后的C++标准中引入了"值初始化"的概念.这也将"new A"和"new A()"之间的区别转移到"has user-declared constructor or not"行.在最初的C++标准(C++ 98)中,没有"值初始化",两者之间的差异由POD /非POD属性定义.根据编译器遵循的语言规范,您可能会得到不同的结果.顺便说一句,上面的`struct A`就是一个例子. (3认同)
  • 而且,措辞实际上令人困惑.POD到底是怎么回事? (2认同)