En informática , un tipo de datos compuestos o tipo de datos compuestos es cualquier tipo de datos que se puede construir en un programa utilizando los tipos de datos primitivos del lenguaje de programación y otros tipos compuestos. A veces se le llama estructura o tipo agregado , [1] aunque este último término también puede referirse a matrices , listas , etc. El acto de construir un tipo compuesto se conoce como composición . Los tipos de datos compuestos a menudo se contrastan con las variables escalares .
A struct
es la noción de C y C++ de un tipo compuesto, un tipo de datos que compone un conjunto fijo de campos o miembros etiquetados . Se llama así por la struct
palabra clave utilizada al declararlos, que es la abreviatura de estructura o, más precisamente, estructura de datos definida por el usuario . [ cita necesaria ]
En C++, la única diferencia entre a struct
y una clase es el nivel de acceso predeterminado , que es privado para las clases y público para struct
s.
Tenga en cuenta que si bien las clases y la class
palabra clave eran completamente nuevas en C++, el lenguaje de programación C ya tenía un tipo sin formato de struct
s. Para todos los efectos, los C++ struct
forman un superconjunto de C struct
: prácticamente todos struct
los C válidos son C++ válidos struct
con la misma semántica.
Una struct
declaración consta de una lista de campos, cada uno de los cuales puede ser de cualquier tipo. El almacenamiento total requerido para un struct
objeto es la suma de los requisitos de almacenamiento de todos los campos, más cualquier relleno interno .
Por ejemplo:
estructura Cuenta { int número_cuenta ; char * nombre_nombre ; char * apellido ; equilibrio flotante ; };
define un tipo, denominadostruct Account
. Para crear una nueva variable de este tipo, podemos escribir struct Account myAccount;
que tiene un componente entero, al que se accede mediante myAccount.account_number
, y un componente de punto flotante, al que se accede mediante myAccount.balance
, así como los componentes first_name
y last_name
. La estructura myAccount
contiene los cuatro valores y los cuatro campos se pueden cambiar de forma independiente.
Dado que escribir struct Account
repetidamente en código se vuelve engorroso, no es inusual ver una typedef
declaración en código C que proporcione un sinónimo más conveniente para struct
. Sin embargo, algunos [ ¿quién? ] Las guías de estilo de programación desaconsejan esto, alegando que puede ofuscar el tipo.
Por ejemplo:
typedef struct Cuenta_ { int número_cuenta ; char * nombre_nombre ; char * apellido ; equilibrio flotante ; } Cuenta ;
En el código C++, typedef
no es necesario porque los tipos definidos usando struct
ya forman parte del espacio de nombres normal, por lo que se puede hacer referencia al tipo como struct Account
o simplemente Account
.
Como otro ejemplo, se podría crear un tipo compuesto vectorial tridimensional que utilice el tipo de datos de punto flotante con:
estructura Vector { flotador x ; flotar y ; flotar z ; };
Una variable nombrada velocity
con un Vector
tipo compuesto se declararía como Vector velocity;
miembros de los que velocity
se accedería mediante una notación de puntos. Por ejemplo, velocity.x = 5;
establecería el x
componente de velocity
igual a 5.
Asimismo, se podría crear una estructura de color usando:
Color de estructura { int sin signo rojo ; sin firmar int verde ; sin firmar en azul ; };
En los gráficos 3D, normalmente debes realizar un seguimiento tanto de la posición como del color de cada vértice. Una forma de hacer esto sería crear un Vertex
tipo compuesto, utilizando los tipos compuestos Vector
y creados anteriormente:Color
estructura Vértice { Posición del vector ; Color de color ; };
Cree una variable de tipo struct Vertex
usando el mismo formato que antes:Vertex v;
Asigne valores a los componentes de v
esta manera:
v . posición . x = 0,0 ; v . posición . y = 1,5 ; v . posición . z = 0,0 ; v . color . rojo = 128 ; v . color . verde = 0 ; v . color . azul = 255 ;
El uso principal de struct
es para la construcción de tipos de datos complejos, pero a veces se usa para crear subtipos estructurales primitivos . Por ejemplo, dado que el Estándar C [ cita necesaria ] requiere que si dos estructuras tienen los mismos campos iniciales, esos campos se representarán de la misma manera, el código
struct ifoo_old_stub { largo x , y ; }; estructura ifoo_version_42 { largo x , y , z ; nombre del personaje ; largo a , b , c ; }; void operator_on_ifoo ( estructura ifoo_old_stub * ); estructura ifoo_version_42s ; . . . operar_on_ifoo ( & s );
funcionará correctamente.
Las firmas de tipo (o tipos de función ) se construyen a partir de tipos primitivos y compuestos, y pueden servir como tipos en sí mismos al construir tipos compuestos:
estructura typedef { int x ; int y ; } Punto ; typedef double ( * Métrica ) ( Punto p1 , Punto p2 ); estructura typedef { Centro del punto ; doble radio ; Métrica métrica ; } Círculo ;