在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:如何初始化未在构造函数的成员初始值设定项列表中列出的基数和成员.