class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
¿Es esto correcto?¿Cómo puedo usar la lista de inicialización de miembros para inicializar una matriz?
class A {
public:
A();
private:
char a[5];
int* ptr;
};
A::A() : a(0), ptr(0) { }
¿Es esto correcto?¿Cómo puedo usar la lista de inicialización de miembros para inicializar una matriz?
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 paraT
se llama (y la inicialización está mal formada siT
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 deT
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 de0
(cero) convertido aT
;- 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.
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)};
¿Espera, no en C++ 0x tampoco? D: – GManNickG
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
@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. –