The section \"Array Initialization\" in Chapter 4, page 231 of \"Thinking in Java, 2nd Edition\" has this to say:
Initializing arrays in C
I am assuming that the author is warning you about the lack of enforcing size constraints in C and C++. In C and C++, arrays decay down to pointers to their first element. It then uses pointer arithmetic to find the element you are refering to by index. Since arrays are not objects and the compiler makes no effort to store their size, there are no length checks. In java, arrays are objects and therefore their size is known. This size can be checked against, which safe guards the developer from accessing memory which doesn't belong to him/her when overstepping the bounds of the array.
I find it strange the statement 'C++ uses aggregate initialize to make it much safer' was even used in this context.
Aggregate initialization, which is common to most modern languages, is as follows
int intArray[3] = {1,2,3};
int int2DArray[2][2] = {{1,2}, {3,4}};
This type of initialization assumes you know the size of the array beforehand and its contents. This type of initialization safe guards one from over stepping the boundary and provides for initializing an array with set values. Maybe in this case the author has in a mind a developer who declared a static C array of size 5. This developer then creates a loop to initialize its content but oversteps the boundary of the array by one, writing to memory that is not his/hers.