假设我有一个看起来像这样的结构(POD):
struct Foo
{
int i;
double d;
};
以下两行有什么区别:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
答案 0 :(得分:13)
第一个保留未初始化的值;第二个将它们初始化为零。这只是POD类型的情况,它没有构造函数。
答案 1 :(得分:1)
我什么都没想。 Foo()
被允许,即使它没有意义......我已经尝试将struct
更改为class
并尝试在生成的exe上进行差异,结果是相同的,意味着没有方法的类就像一个从实际和“有效”的角度来看的结构。
但是:如果您只使用一个替代方案,保持struct
或class
无论如何,都会发生{{1} }和new Foo
给出了不同的可执行文件! (至少使用g ++)I.e。
struct Foo { int i; double d; } int main() { Foo *f1 = new Foo; delete f1; }
被编译成与
不同的somehingstruct 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。所以结构可以有构造函数,语法与类相同。