C++ default initialization and value initialization: which is which, which is called when and how to reliably initialize a template-type member

Not so hard:

A x;
A * p = new A;

These two are default initialization. Since you don’t have a user-defined constructor, this just means that all members are default-initialized. Default-initializing a fundamental type like int means “no initialization”.

Next:

A * p = new A();

This is value initialization. (I don’t think there exists an automatic version of this in C++98/03, though in C++11 you can say A x{};, and this brace-initialization becomes value-initialization. Moreover, A x = A(); is close enough practically despite being copy-initialization, or A x((A())) despite being direct-initialization.)

Again, in your case this just means that all members are value-initialized. Value initialization for fundamental types means zero-initialization, which in turn means that the variables are initialized to zero (which all fundamental types have).

For objects of class type, both default- and value-initialization invoke the default constructor. What happens then depends on whether default constructor is compiler or user defined. If user defined, in both default- and value-initialization behave the same way and what happens depends on the constructor’s initializer list, and the game continues recursively for member variables. If compiler defined, default and value initialization behave as expected.

Leave a Comment