Que es un sindicato de clase

La unión de c en la estructura

Este artículo necesita citas adicionales para su verificación. Por favor, ayude a mejorar este artículo añadiendo citas de fuentes fiables. El material sin fuente puede ser cuestionado y eliminado.Buscar fuentes:  «Tipo de unión» – noticias – periódicos – libros – scholar – JSTOR (agosto de 2009) (Aprende cómo y cuándo eliminar este mensaje de la plantilla)

En informática, una unión es un valor que puede tener cualquiera de varias representaciones o formatos dentro de la misma posición en la memoria; que consiste en una variable que puede contener dicha estructura de datos. Algunos lenguajes de programación admiten tipos de datos especiales, llamados tipos de unión, para describir tales valores y variables. En otras palabras, la definición de un tipo de unión especificará cuál de una serie de tipos primitivos permitidos puede almacenarse en sus instancias, por ejemplo, «float o entero largo». A diferencia de un registro (o estructura), que puede contener un flotador y un entero, en una unión sólo hay un valor en cada momento.

Una unión puede imaginarse como un trozo de memoria que se utiliza para almacenar variables de diferentes tipos de datos. Una vez que se asigna un nuevo valor a un campo, los datos existentes se sobrescriben con el nuevo dato. La zona de memoria que almacena el valor no tiene un tipo intrínseco (más allá de los bytes o palabras de memoria), pero el valor puede tratarse como uno de varios tipos de datos abstractos, teniendo el tipo del valor que se escribió por última vez en la zona de memoria.

C unión anónima

Una unión puede tener funciones miembro (incluyendo constructores y destructores), pero no funciones virtuales. Una unión no debe tener clases base. Una unión no debe ser utilizada como clase base. Un objeto de una clase con un constructor no trivial, un constructor-copia no trivial, un destructor no trivial o un operador de asignación de copias no trivial no puede ser miembro de una unión, ni tampoco una matriz de dichos objetos. Si una unión contiene un miembro de datos estáticos, o un miembro de un tipo de referencia, el programa está mal formado.

Un tipo POD en C++ se define como un tipo escalar o una clase POD. La clase POD no tiene un operador de asignación de copia definido por el usuario, ni un destructor definido por el usuario, ni miembros de datos no estáticos que no sean ellos mismos POD. Además, la clase POD debe ser un agregado, lo que significa que no tiene constructores declarados por el usuario, ni datos no estáticos privados o protegidos, ni bases ni funciones virtuales. La norma incluye declaraciones sobre cómo deben comportarse los POD en C++.

En determinados contextos, C++ sólo permite utilizar tipos POD. Por ejemplo, una unión en C++ no puede contener una clase que tenga funciones virtuales, o constructores o destructores no triviales. Esta restricción se impone porque el compilador no puede saber qué constructor o destructor debe ser llamado para una unión.

Ejemplo de unión en c

el nombre de la unión que se está definiendo. Opcionalmente, va precedido de un especificador de nombre anidado (secuencia de nombres y operadores de resolución de ámbito, que termina con el operador de resolución de ámbito). El nombre puede omitirse, en cuyo caso la unión no tiene nombre

Si una unión contiene un miembro de datos no estático con una función miembro especial no trivial (constructor de copia/movimiento, asignación de copia/movimiento o destructor), esa función se elimina por defecto en la unión y debe ser definida explícitamente por el programador.

Si una unión contiene un miembro de datos no estático con un constructor por defecto no trivial, el constructor por defecto de la unión se elimina por defecto a menos que un miembro variante de la unión tenga un inicializador de miembro por defecto .

La unión sólo es tan grande como sea necesario para contener su miembro de datos más grande. Los otros miembros de datos se asignan en los mismos bytes como parte de ese miembro mayor. Los detalles de esa asignación están definidos por la implementación, pero todos los miembros de datos no estáticos tendrán la misma dirección (desde C++14). Es un comportamiento indefinido leer del miembro de la unión que no fue escrito más recientemente. Muchos compiladores implementan, como una extensión no estándar del lenguaje, la capacidad de leer miembros inactivos de una unión.

Unión con etiqueta c

el nombre de la unión que se está definiendo. Puede ir precedido de un especificador de nombre anidado (secuencia de nombres y operadores de resolución de ámbito, que termina con el operador de resolución de ámbito). El nombre puede omitirse, en cuyo caso la unión no tiene nombre

Si una unión contiene un miembro de datos no estático con una función de miembro especial no trivial (constructor de copia/movimiento, asignación de copia/movimiento o destructor) esa función se elimina por defecto en la unión y necesita ser definida explícitamente por el programador.

La unión sólo es tan grande como sea necesario para contener su miembro de datos más grande. Los otros miembros de datos se asignan en los mismos bytes como parte de ese miembro mayor. Los detalles de esa asignación son definidos por la implementación, y es un comportamiento indefinido leer desde el miembro de la unión que no fue escrito más recientemente, ya que viola el aliasing de tipos. Muchos compiladores implementan, como una extensión no estándar del lenguaje, la capacidad de leer los miembros inactivos de una unión.

Una clase tipo unión es cualquier clase con al menos una unión anónima como miembro. Los miembros de esa unión anónima se denominan miembros variantes. Las clases tipo unión pueden utilizarse para implementar uniones etiquetadas.