C++ 中的默认结构初始化
Posted
技术标签:
【中文标题】C++ 中的默认结构初始化【英文标题】:Default Struct Initialization in C++ 【发布时间】:2010-06-01 16:38:23 【问题描述】:假设我有一个看起来像这样的结构(一个 POD):
struct Foo
int i;
double d;
;
以下两行有什么区别:
Foo* f1 = new Foo;
Foo* f2 = new Foo();
【问题讨论】:
注意相关问题Why is it an error to use an empty set of brackets to call a constructor with no arguments?。 【参考方案1】:第一个未初始化值;第二个将它们初始化为零。这仅适用于没有构造函数的 POD 类型。
【讨论】:
谢谢!这是唯一的区别吗? 是的,这是唯一的区别。 如果我没记错的话,这只是在标准的一些较新版本中添加的(2003 年?)【参考方案2】:我想什么都没有。 Foo()
是允许的,即使它没有任何意义...我尝试将 struct
更改为 class
并尝试对生成的 exe 进行比较,结果是相同的,这意味着没有从实用和“有效”的角度来看,方法就像一个结构。
但是:如果你只使用一个的替代方案,不管struct
或class
,new Foo
和new Foo()
会给出不同的可执行文件! (至少使用 g++)即
被编译成不同于
的东西 结构 Foo int i;双 d; int main() Foo *f1 = new Foo();删除 f1;同样的情况发生在class
而不是struct
。要知道区别在哪里,我们应该查看生成的代码......并且要知道它是否是 g++ 特质,我应该尝试另一个编译器,但我只有 gcc,现在没有时间分析 g++ 的 asm 输出。 ..
无论如何,从“功能”(实用)的角度来看,都是一样的。
添加
最后,最好了解或对问答网站上的一些常见人为问题进行更深入的调查...... g++ 在 () 和 no () 情况下生成的代码的唯一区别,
移动 $0, (%eax) 佛罗里达州 fstpl 4(%eax)这是一个片段,它将结构的 int 和 double 初始化为 0/0.0...所以 Seymour 更了解它(但我本可以在不知道是否先查看 asm 的情况下发现它!)
【讨论】:
为什么使用括号没有意义,它正在调用默认构造函数。如果有的话,缺少括号是没有意义的。 你在说什么?这是一个测试,对于这个问题和 foo() 通常意味着对函数/方法的调用这一事实是合理的;一个不太有用的测试,而不是阅读规格,这可能是一个批评者。你的评论对我来说毫无意义。【参考方案3】:根据我发布的链接。
在 C++ 中,类和结构的唯一区别是类成员默认是私有的,而结构成员默认是公有的。所以结构可以有构造函数,语法和类一样。
Struct Constructor Info
【讨论】:
重点是在构造新对象时使用或省略了弯括号。这个问题适用于类和结构。以上是关于C++ 中的默认结构初始化的主要内容,如果未能解决你的问题,请参考以下文章