c++ - que - struct c# ejemplos
¿Cómo inicializar member-struct en la lista de inicializadores de la clase C++? (2)
En C ++ estándar necesitas crear un ctor para Foo.
struct Foo {
Foo(int const a, std::initializer_list<char> const b, short* c)
: x(a), y(c) {
assert(b.size() >= 24, "err");
std::copy(b.begin(), b.begin() + 24, array);
}
~Foo() { delete y; }
int x;
char array[24];
short* y;
};
class Bar {
Bar() : x(5), foo(5, {''a'', ''b'', ..., ''y'', ''z''},
new short(5)) { }
private:
int x;
Foo foo;
};
En C ++ 0x puedes usar una lista de inicialización uniforme, pero aún necesitas dtor para Foo:
class Bar {
Bar() : x(5), foo{5, new char[24]{''a'', ''b'', ..., ''y'', ''z''},
new short(5)} { }
~Bar() { delete[] foo.array; delete foo.y;}
}
private:
int x;
Foo foo;
};
Para inicializar por defecto foo
(como Bar() : foo(), x(8) { }
), debe darle a Foo un ctor predeterminado.
Tengo las siguientes definiciones de clase en c ++:
struct Foo {
int x;
char array[24];
short* y;
};
class Bar {
Bar();
int x;
Foo foo;
};
y me gustaría inicializar la estructura "foo" (con todos sus miembros) a cero en el inicializador de la clase Bar. ¿Puede esto hacerse de esta manera?
Bar::Bar()
: foo(),
x(8) {
}
...?
¿O qué exactamente hace el foo (x) en la lista de inicializadores?
¿O la estructura incluso se inicializó automáticamente a cero desde el compilador?
En primer lugar, debe (¡debe!) Leer esta faq c ++ con respecto a POD y agregados. En su caso, Foo
es de hecho una clase POD y foo()
es una inicialización de valor :
Valorizar-inicializar un objeto de tipo T significa:
- si T es un tipo de clase (cláusula 9) con un constructor declarado por el usuario (12.1), entonces el constructor predeterminado
para T se llama (y la inicialización está mal formada si T no tiene un constructor por defecto accesible);- si T es un tipo de clase no sindical sin un constructor declarado por el usuario, entonces cada componente de datos no estáticos y de clase base de T tiene valor inicializado;
- si T es un tipo de matriz, entonces cada elemento se inicializa en valor;
- de lo contrario, el objeto tiene cero inicialización
Entonces sí, foo se inicializará en cero. Tenga en cuenta que si eliminó esta inicialización del constructor de Bar
, foo
solo se inicializaría por defecto :
Si no se especifica ningún inicializador para un objeto, y el objeto es de tipo de clase no POD (posiblemente un CV), el objeto se inicializará por defecto; si el objeto es de tipo const-qualified, el tipo de clase subyacente tendrá un constructor predeterminado declarado por el usuario. De lo contrario, si no se especifica un inicializador para un objeto no estático, el objeto y sus subobjetos, si los hay, tienen un valor inicial indeterminado ;