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

7

假设我有这样一个结构体(一个POD):

struct Foo
{
  int i;
  double d;
};

以下两行代码有何不同:

这是什么意思?

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

3个回答

13

第一个选项将值保留为未初始化状态;第二个选项将它们初始化为零。这仅适用于POD类型,这些类型没有构造函数。


谢谢!这是唯一的区别吗? - criddell
5
是的,这是唯一的区别。 - Mike Seymour
如果我没记错的话,这只是在一些新版本的标准中添加的(2003年?) - Suma

1

我什么也不假设。即使没有意义,Foo()也是允许的... 我试着将 struct 改为 class 并在生成的exe文件上进行了比较,结果相同,这意味着从实际和“有效”的角度来看,一个没有方法的类就像一个结构体。

但是:如果只使用其中一种选择,在保持不变的情况下,无论是struct还是class,它们都会产生不同的可执行文件! (至少使用g++)例如:

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

编译成了与下面的代码不同的内容:

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

而且与struct相比,class也是一样的。要知道区别在哪里,我们应该看生成的代码... 要知道这是否是g++的特殊情况,我应该尝试另一个编译器,但我只有gcc,现在没有时间分析g++的汇编输出...

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

添加

最后,了解或深入研究一些常见的人类问题,可以在问答网站上进行... g++生成的代码在有()和无()的情况下唯一的区别是:

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

这是一个片段,将结构体的整数和浮点数初始化为0/0.0... 所以Seymour更了解它(但如果我先看了汇编代码,我也可以发现它!)


为什么使用方括号没有意义,它会调用默认构造函数。如果有什么不合理的话,那就是缺少圆括号。 - Salgar
你在说什么?这只是一个测试,对于问题和foo()通常表示调用函数/方法的事实来说是合理的;这不是一个很有用的测试,而是可能会引起批评,与其读规格说明不如进行批判。你的评论对我毫无意义。 - ShinTakezou

-2
根据我发布的链接。
在C++中,类和结构之间唯一的区别是类成员默认为私有,而结构成员默认为公共。因此,结构体可以有构造函数,语法与类相同。 结构体构造函数信息

1
重点在于构建新对象时使用或省略圆括号。这个问题适用于类和结构体。 - Troubadour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接