2011-04-09 6 views

Respuesta

19

Lo único sensato que puede hacer con un C-array en C++ 03 es inicializar el valor (en C++ 11 y más allá puede inicializarse en una lista).

de la norma C++ 03, §8.5/7:

Un objeto cuya inicializador es un conjunto vacío de paréntesis, es decir,(), será de valor inicializado.

Y de §8.5/5:

Para valor-inicializar un objeto de tipo T significa:

  • si T es un tipo de clase con un constructor-declarado de usuario, entonces el constructor predeterminado para T se llama (y la inicialización está mal formada si T no tiene un constructor predeterminado accesible);
  • si T es un tipo de clase no sindical sin un constructor declarado por el usuario, entonces cada miembro de datos no estáticos y componente de clase base de T tiene un valor inicializado;
  • si T es un tipo de matriz, cada elemento se inicializa en valor;
  • de otro modo, el objeto se cero inicializa

Para cero inicializar un objeto de tipo T significa:

  • si T es un tipo escalar, el objeto es establecido en el valor de 0 (cero) convertido a T;
  • si T es un tipo de clase no sindical, cada miembro de datos no estático y cada subobjeto de clase base tiene inicialización cero;
  • si T es un tipo de unión, el primer miembro de datos con nombre del objeto) no se inicializa;
  • si T es un tipo de matriz, cada elemento tiene cero inicialización;
  • si T es un tipo de referencia, no se realiza ninguna inicialización.

tanto, si su definición del constructor se cambia a

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

continuación, se le garantiza que después de la construcción, los 5 elementos de A::a tendrá el valor '\0' y A::ptr será nulo.

3

Miedo no; C++ no admite matrices de inicialización como esta.

Usted sólo tiene que asignar a sus miembros en el cuerpo del constructor A 's, o puede utilizar valor de inicialización si no te importa lo que los valores son:

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

C++ 0x no le permiten dar a todos los valores, sin embargo:

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

Tenga en cuenta, sin embargo, que debido a que las matrices no son class-object s, usted no será capaz de hacer esto:

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

¿Espera, no en C++ 0x tampoco? D: – GManNickG

+0

Bueno, en C++ 0x se entiende (¡espero!) Que siempre se debe usar 'std :: array <>' sobre las matrices C, que pueden inicializarse de manera sensible y barata y devolverse desde una función miembro estática para usar en las listas de inicialización de c'tor. – ildjarn

+0

@GMan: De hecho. No puede inicializar una matriz con 'std :: initializer_list <>', porque las matrices no tienen constructores. Todavía termina iterando a través de _algo_ en el cuerpo constructor del tipo adjunto. La razón por la que esto no es realmente un problema es lo que dijo ildjarn. –

Cuestiones relacionadas