class MyClass {
private:
static char my2dArray[10][20];
};
char MyClass::my2dArray[10][20] = {{0}};
Now does this initialize all elements of this array with 0?
Sort of.
Recall that the elements of your array are not char
, but char[10]
(which cannot be 0
).
What you're doing here is initialising the outer array by providing an initialiser for the first inner array ({0}
, again setting only the inner array's first element to 0
).
You're then letting the "default", implicit initialization behaviour take over for the subsequent elements in both arrays.
[n3290: 8.5.1/1]:
An aggregate is an array or a class (Clause 9)
with no user-provided constructors (12.1), no
brace-or-equal-initializers for non-static data members (9.2), no
private or protected non-static data members (Clause 11), no base
classes (Clause 10), and no virtual functions.
[n3290: 8.5.1/2]:
When an aggregate is initialized by an initializer
list, as specified in 8.5.4, the elements of the initializer list are
taken as initializers for the members of the aggregate, in increasing
subscript or member order. Each member is copy-initialized from the
corresponding initializer-clause. If the initializer-clause is an
expression and a narrowing conversion (8.5.4) is required to convert
the expression, the program is ill-formed. [ Note: If an
initializer-clause is itself an initializer list, the member is
list-initialized, which will result in a recursive application of the
rules in this section if the member is an aggregate. —end note ]
[n3290: 8.5.1/7:]
If there are fewer initializer-clauses in the list
than there are members in the aggregate, then each member not
explicitly initialized shall be initialized from an empty initializer
list (8.5.4).
[n3290: 8.5.4/3:]
[..] Otherwise, if the initializer list has no
elements, the object is value-initialized. [..]
The [final draft] standard actually contains a non-normative example of a similar behaviour:
[n3290: 8.5.1/10]:
[..] [ Example: [..] On the other hand,
float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
initializes the first column of y
(regarded as a two-dimensional
array) and leaves the rest zero. —end example ]
So, ultimately, yes. All of your innermost array elements will hold the value 0
; it's just that your {{0}}
didn't actually do very much to make that happen.
Assuming it's mandatory that all elements are explicitly initialized to 0.
Well, since your array has static
storage duration, its memory will be zero-initialised anyway, so this is ultimately pointless to bother concerning yourself over.
Also, if I have the following type definition:
typedef unsigned char u8;
and this array is static u8 my2dArray[10][20]
, will the same initialization work?
Yes. The type alias doesn't change anything: this array has precisely the same type (and storage duration) as the first one, and the same rules apply.