2009-10-17 158 views
21

在C++中,就是既下列动态对象的作品之间的确切区别:A * pA = new A之间的区别;和A * pA = new A();

A* pA = new A; 

A* pA = new A(); 

我做了一些测试,但似乎在这两种情况下,默认的构造函数被调用,只有它。我正在寻找关于性能有什么区别...

感谢

回答

38

如果A是POD型,然后将new A分配一个新的A对象,但有一个不确定的值离开它,否则会new A默认初始化新的对象。

在所有情况下new A()值初始化新的A对象。

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

E.g.

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:含义零初始化缺省初始化值初始化

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

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

+0

这是正确的。 – 2009-10-17 10:17:10

+0

嗯,有没有参考? – hasen 2009-10-17 10:43:47

+2

,并且措辞实际上令人困惑。 POD到底是什么? – hasen 2009-10-17 10:47:46

0

这是完全一样的,也是明智的性能:)

+2

这根本不对。这两个表达式对于没有用户定义的构造函数的POD类型和非POD类类型都有不同的影响。 – 2009-10-17 09:57:52

+0

Charles Bailey是正确的。 – 2009-10-17 10:19:39

+2

什么是“POD”? – hasen 2009-10-17 10:42:14

0

的词法分析器将在第一个版本扫描两个字符少,所以编译过程是快一点;)

+3

...并且它们具有不同的语义。 – 2009-10-17 09:58:24

-1

请参阅STL实现代码(例如allocator),那么你就会明白。

相关问题