Adrian
Adrian

Reputation: 20068

Default constructors C++

Lets say I have this class:

class X {
public:
    int x;
};

I saw that if I create an instance of X locally, x will not be initialize to 0, only if I create it globally.
Does this mean that the default constructor isn't synthesized by the compiler(I doubt it) for objects created localy or it will be synthesized but not zero out x value, if this is the case why is that ?

Upvotes: 5

Views: 1650

Answers (4)

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385104

X gets a synthesised constructor, but synthesised constructors do not zero-initialise primitives.

Upvotes: 2

holtavolt
holtavolt

Reputation: 4458

You are combining the concept of object construction with member initialization. As a general rule, don't expect C++ to initialize primitive data members for you, you'll need to do that yourself (preferably via an initialization list after the constructor.)

This is primarily for speed, as this allows allocation without initialization, which is useful if, for instance, you will be computing the values of the data members later and overwriting any "default" values.

I've found this site a useful reference in the past: http://www.cplusplus.com/doc/tutorial/variables/

Upvotes: 0

TheFogger
TheFogger

Reputation: 2429

Constructors in C++ don't generally initialize members to 0. You have to explicitly initialize members with a value.

The reason that in the global case the memory is zero, is because static memory gets initialized to zero before anything else happens to it. In your case, the implicitly generated default constructor gets called afterwards, which does not touch the memory for member X.

See also this answer from Derek: Is global memory initialized in C++?

Note, however, that default constructors for structured, non-POD members (classes and structs) do automatically get called by the default constructor. It's just the POD members that are left alone by default.

Upvotes: 4

karlphillip
karlphillip

Reputation: 93410

Default constructors are not aware that it should initialize your member variables. If you need to initialize x to something, you better add your own constructor to do this for you:

class X {
public:
    X() : x(0) { };
    int x;
};

Upvotes: -1

Related Questions