sharp que programacion objeto lenguaje estructuras estructura entre ejemplos diferencia datos clases clase c++ list constructor struct initializer

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 ;