Como posso usar a lista de boot de membros para inicializar uma matriz?

class A { public: A(); private: char a[5]; int* ptr; }; A::A() : a(0), ptr(0) { } 

Isto está certo?

A única coisa sensata que você pode fazer com um array C em C ++ 03 é inicializá-lo por valor (em C ++ 11 e além disso, ele pode ser inicializado por lista).

Do padrão C ++ 03, §8.5 / 7:

Um object cujo inicializador é um conjunto vazio de parênteses, isto é, (), deve ser inicializado por valor.

E de § 8.5 / 5:

Para inicializar o valor de um object do tipo T significa:

  • se T é um tipo de class com um construtor declarado pelo usuário, então o construtor padrão para T é chamado (e a boot é mal formada se T não tiver nenhum construtor padrão acessível);
  • se T for um tipo de class não-union sem um construtor declarado pelo usuário, então todos os membros de dados não estáticos e o componente de class base de T é inicializado por valor;
  • se T é um tipo de matriz, então cada elemento é inicializado por valor;
  • caso contrário, o object será inicializado com zero

Para inicializar zero um object do tipo T significa:

  • se T é um tipo escalar, o object é configurado para o valor 0 (zero) convertido para T ;
  • se T for um tipo de class não-union, cada membro de dados não estáticos e cada subobject de class base será inicializado com zero;
  • se T for um tipo de união, o primeiro membro de dados nomeado do object) será inicializado com zero;
  • se T é um tipo de matriz, cada elemento é inicializado com zero;
  • se T é um tipo de referência, nenhuma boot é executada.

Então, se sua definição de construtor for alterada para

 A::A() : a(), ptr() { } 

então você está garantido que pós-construção, todos os 5 elementos de A::a terão o valor '\0' e A::ptr será nulo.

Com medo não; C ++ não suporta a boot de matrizes como essa.

Você apenas terá que atribuir a seus membros no corpo do construtor de A, ou você pode usar a boot de valor se você realmente não se importa com os valores:

 struct A { int x[5]; A() : x(); }; 

C ++ 0x permite que você forneça todos os valores, embora:

 struct A { int x[5]; A() : x{1,2,3,4,5} {} }; 

Note, no entanto, que porque os arrays não são class-object , você não será capaz de fazer isso:

 struct A { int x[5]; A(std::initializer_list& i) // or whatever the T should be : x{i} // or x(i) {} } A a({1,2,3,4,5)};