I have a class with an array member that I would like to initialize to all zeros.
class X
{
private:
int m_array[10];
};
For a local variable, there is a straightforward way to zero-initialize (see here):
int myArray[10] = {};
Also, the class member m_array
clearly needs to be initialized, as default-initializing ints will just leave random garbage, as explained here.
However, I can see two ways of doing this for a member array:
With parentheses:
public:
X()
: m_array()
{}
With braces:
public:
X()
: m_array{}
{}
Are both correct? Is there any difference between the two in C++11?
Initialising any member with
()
performs value initialisation.Initialising any class type with a default constructor with
{}
performs value initialisation.Initialising any other aggregate type (including arrays) with
{}
performs list initialisation, and is equivalent to initialising each of the aggregate's members with{}
.Initialising any reference type with
{}
constructs a temporary object, which is initialised from{}
, and binds the reference to that temporary.Initialising any other type with
{}
performs value initialisation.Therefore, for pretty much all types, initialisation from
{}
will give the same result as value initialisation. You cannot have arrays of references, so those cannot be an exception. You might be able to construct arrays of aggregate class types without a default constructor, but compilers are not in agreement on the exact rules. But to get back to your question, all these corner cases do not really matter for you: for your specific array element type, they have the exact same effect.Parentheses work in C++98, and are calling for zero initialization, which is what you want. I verified on gcc 4.3. Edit: removed incorrect statement about C++11. I also confirmed that empty braces perform empty-list-initialization using clang 3.4 with -std=c++11.
The types of initialization can be kind of tedious to go through, but in this case it is trivial. For:
since the expression-list between the parentheses are empty, value-initialization occurs. Similarly for:
list-initialization occurs, and subsequently value-initialization since the brace-init-list is empty.
To give a more comprehensive answer, let's go through §8.5 of N4140.
This indeterminate value is what you refer to as garbage values.
So far it's clear that value initialization will make each element of the array zero since
int
is not a class type. But we have not yet covered list initialization and aggregate initialization, since an array is an aggregate.§8.5.4:
And back to §8.5.1:
And we end with §8.5.4 again:
Since traversing the (draft) standard can take breath out of you, I recommend cppreference as it breaks it down pretty good.
Relevant links:
cppreference:
aggregate initialization
value initialization
Draft standard: