7

Say I have a struct that looks like this (a POD):

struct Foo
{
  int i;
  double d;
};

What are the differences between the following two lines:

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

3 Answers 3

13

The first one leaves the values uninitialised; the second initialises them to zero. This is only the case for POD types, which have no constructors.

Sign up to request clarification or add additional context in comments.

3 Comments

Thank you! Is that the only difference?
Yes, that's the only difference.
And if I am not mistaken, this was only added in some newer revisions of the standard (2003?)
1

I suppose nothing at all. Foo() is allowed, even if it makes no sense... I've tried to change struct into class and tried a diff on the generated exe, and they resulted to be the same, meaning that a class without method is like a struct from a practical and "effective" point of view.

But: if you use only one of the alternative, keeping struct or class no matter, it happens that new Foo and new Foo() gives executables which differ! (At least using g++) I.e.

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

is compiled into somehing different from

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

and the same happens with class instead of struct. To know where the difference is we should look at the generated code... and to know if it is a g++ idiosincracy or not, I should try another compiler but I have only gcc and no time now to analyse the asm output of g++...

Anyway from a "functional" (practical) point of view, it is the same thing.

Add

At the end it is always better to know or do deeper investigation for some common human problems on Q/A sites... the only difference in the code generated by g++ in () and no () cases,

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

which is a fragment that initializes to 0/0.0 the int and the double of the struct... so Seymour knows it better (but I could have discovered it without knowing if I had taken a look at the asm first!)

2 Comments

Why does using brackets make no sense, it is invoking the default constructor. If anything, a lack of parens makes no sense.
what are you saying? it's a test, plausible for the question and the fact that foo() normally means a call to a function/method; a not so useful test, rather than a reading of specs, this would have been a possible critic.Your comment means nothing to me.
-2

Per the link I posted.

In C++ the only difference between a class and a struct is that class-members are private by default, while struct-members default to public. So structures can have constructors, and the syntax is the same as for classes.

Struct Constructor Info

1 Comment

The point is the use or omission of the curved brackets when constructing new objects. The question applies to classes as well as structs.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.