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 进行比较,结果是相同的,这意味着没有从实用和“有效”的角度来看,方法就像一个结构。

但是:如果你只使用一个的替代方案,不管structclassnew Foonew Foo()会给出不同的可执行文件! (至少使用 g++)即

结构 Foo int i;双 d; int main() Foo *f1 = new Foo;删除 f1;

被编译成不同于

的东西 结构 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++ 中的默认结构初始化的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的结构构造函数?

C++结构体如何设置默认值?

结构体的初始化(构造函数)

C++ 结构体如何初始化

C 编程语言等效于 C++ 中的结构初始化

在 C++ 中初始化 C 结构