2010-06-01 146 views
7

说我有一个结构,看起来像这样(一POD):默认结构初始化在C++

struct Foo 
{ 
    int i; 
    double d; 
}; 

什么是以下两行之间的差异:

Foo* f1 = new Foo; 
Foo* f2 = new Foo(); 
+0

请注意相关问题[为什么使用一组空括号来调用没有参数的构造函数时出错?](http://stackoverflow.com/questions/180172/why-is-it-an-错误使用的 - 一个空集,括号到的呼叫-A-构造与 - 无)。 – Troubadour 2010-06-01 16:51:49

回答

12

第一个将值初始化;第二个将它们初始化为零。这只是POD类型的情况,它没有构造函数。

+0

谢谢!这是唯一的区别吗? – criddell 2010-06-01 16:58:29

+5

是的,这是唯一的区别。 – 2010-06-01 17:08:46

+0

如果我没有弄错,只会在标准(2003?)的一些较新版本中添加 – Suma 2010-06-01 17:54:01

-2

每链路I发布。

在C++中,类和结构之间的唯一区别是,类成员默认是私有的,而struct-members默认为public。所以结构可以有构造函数,语法和类相同。

Struct Constructor Info

+1

重点是构造新对象时使用或省略曲线括号。这个问题适用于类和结构。 – Troubadour 2010-06-01 16:50:31

1

我想,什么都没有。 Foo()是允许的,即使它没有任何意义......我试图将struct更改为class,并尝试对生成的exe文件进行diff,结果相同,这意味着没有方法的类就像是一个struct一个实用而“有效”的观点。

:如果你只使用替代一个,保持structclass不管了,它发生new Foonew Foo()给出了不同的可执行文件! (至少使用g ++)I.e.

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo; delete f1; } 

被编译成somehing不同

 
struct Foo { int i; double d; } 
int main() { Foo *f1 = new Foo(); delete f1; } 

class代替struct同样的情况。要知道区别在哪里,我们应该看看生成的代码......并且要知道它是否是g ++的特性,我应该尝试使用另一个编译器,但我现在只有gcc,现在没时间分析g ++的asm输出。从“功能”(实用)的角度来说,无论如何,它是一回事。

添加

在结束它始终是更好地了解或做对Q/A网站的一些常见的人类问题顺藤摸瓜......在由g ++中生成的代码的唯一区别()和否()情况下,

 
    movl $0, (%eax) 
    fldz 
    fstpl 4(%eax) 

这是初始化为0/0.0的INT和结构的双重片段...所以西摩知道它更好的(但我可能不知道,如果我发现了它首先看看asm!)

+0

为什么使用括号没有意义,它调用默认的构造函数。如果有的话,缺乏parens是没有意义的。 – Salgar 2010-06-01 16:52:48

+0

你在说什么?这是一个测试,对于问题和foo()通常意味着对函数/方法的调用这一事实似乎是合理的;一个不太有用的测试,而不是阅读规格,这可能是一个可能的评论家。你的评论对我来说毫无意义。 – ShinTakezou 2010-06-01 18:10:31