C ++中的默认结构初始化

时间:2010-06-01 16:38:24

标签: c++ constructor initialization default

假设我有一个看起来像这样的结构(POD):

struct Foo
{
  int i;
  double d;
};

以下两行有什么区别:

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

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:1)

我什么都没想。 Foo()被允许,即使它没有意义......我已经尝试将struct更改为class并尝试在生成的exe上进行差异,结果是相同的,意味着没有方法的类就像一个从实际和“有效”的角度来看的结构。

但是:如果您只使用一个替代方案,保持structclass无论如何,都会发生{{1} }和new 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; }

new Foo()代替class也是如此。要知道差异在哪里,我们应该看看生成的代码......并且要知道它是否是g ++ idiosincracy,我应该尝试另一个编译器,但我只有gcc,现在没时间分析g ++的asm输出。 ..

无论从“功能”(实际)的角度来看,它都是一样的。

添加

最后,总是更好地了解或深入调查Q / A网站上的一些常见人类问题... g ++在()和no()情况下生成的代码的唯一区别,

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

这是一个片段,初始化为0 / 0.0的int和结构的双重...所以Seymour更了解它(但我可以在不知道我是否先看过asm的情况下发现它!)

答案 2 :(得分:-2)

根据我发布的链接。

  

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

Struct Constructor Info