tipo que palabras las ejemplo consisten conjuntos c++ class g++ unions

que - ¿Una unión en C++ en realidad es una clase?



union de palabras en c++ (1)

Un desarrollador junior me preguntó si era posible sobrecargar a los operadores de asignación para una unión con argumentos POD, de modo que el tipo de datos correspondiente dentro de la unión se escribiera cuando una instancia de la unión se asigna a una variable de ese tipo. Respondí que no lo creía, pero luego jugué un poco con el siguiente código. Para mi sorpresa este código realmente compilado (usando g ++ versión 4.6.3 en Ubuntu 12.04)

union unMember { float fData; unsigned int uiData; unMember():uiData(0) {}; unMember(float data):fData(data) {}; unMember(unsigned int data):uiData(data) {}; operator float() {return fData;}; operator unsigned int() {return uiData;}; unMember& operator=(float data) {fData = data;return *this;}; unMember& operator=(unsigned int data) {uiData = data; return *this;}; float GetFloat() const {return fData;}; }; int main () { float fTest = 1.0; unsigned int uiTest = 10; unMember data = fTest; unMember data2 = uiTest; unMember data3 = data2; float f = data.GetFloat(); return 0; }

Esto me ha hecho darme cuenta de que no sé casi nada sobre las uniones (al menos en el contexto de C ++ en lugar de C), ya que realmente no esperaba poder definir las funciones de los miembros para una unión de esta manera. El código anterior me sugiere que en C ++ una unión se implementa internamente como una clase, pero ¿es ese el caso en el estándar de C ++ o es solo una peculiaridad del compilador de g ++?

Además, dado que esto realmente ha afectado mi comprensión de lo que es un sindicato, agradecería cualquier comentario sobre si es aconsejable implementar las funciones de los miembros para los sindicatos de esta manera. ¿Hay algo inherentemente inseguro en la implementación anterior de mi sindicato?

En el pasado, solo he usado uniones dentro de una clase de contenedor que tiene una variable indicadora que almacena el tipo que realmente se ha escrito en la unión y, para ser honesto, pensé que ese era su uso principal. ¿Es realmente común sobrecargar a los constructores, etc. para los sindicatos de esta manera?


¿Una unión en C ++ en realidad es una clase?

Sí. En C ++ una unión es una clase: un tipo especial de clase .

C ++ 11: 9 Clases (p5):

Una unión es una clase definida con la unión clase-clave; tiene solo un miembro de datos a la vez

¿Es realmente común sobrecargar a los constructores, etc. para los sindicatos de esta manera?

Un sindicato es una clase especial con algunas restricciones:

9.5 Uniones (p2):

Una unión puede tener funciones miembro ( incluidos constructores y destructores ), pero no funciones virtuales (10.3). Un sindicato no tendrá clases de base. Una unión no debe ser usada como una clase base.

Control de acceso de 11 miembros (p3):

Los miembros de una clase definida con la palabra clave class son private por defecto. Los miembros de una clase definida con la struct palabras clave o union son public de forma predeterminada.

Por lo tanto, puede sobrecargar constructores, destructores y operadores de forma similar a como lo puede hacer en una clase.