You are on page 1of 4

Estructuras compuestas (struct, union, class) Con base en los tipos bsicos mostrados arriba, se pueden crear nuevos

tipos con estructuras compuestas por uno o ms de uno de los tipos mencionados. En C, C++ en orden de crear nuevas estructuras se emplean las palabras reservadas struct, union y class. struct: esta orden se emplea para agrupar variables de tipos iguales o diferentes en un solo registro, con la misma se pueden crear estructuras annimas, estructuras con nombre, y un tipo especial de estructura conocida como bit-fields ( banderas o campos de bits ). union: una union es similar a una struct, salvo que en una estructura creada con union los campos o variables comparten una direccin de almacenamiento comn. class: una clase es una estructura en donde se agrupan variables y funciones, la misma es usada en Programacin Orientada al Objeto. Las clases no son soportadas por el C estndar. Nota: tanto las estructuras como las uniones y las clases pueden ser annimas, pero lo ms recomendable es darle a las mismas un nombre. Si una estructura, union o clase posee nombre, esta pueden ser empleadas para declarar variables de la misma y, lo ms importante, puede ser usada para el paso de parmetros a funciones. _______________________________________ Sintaxis general: struct struct [ <nombre tipo de estructura > ] { [ <tipo> <nombre-variable[, nombre-variable, ...]> ] ; [ <tipo> <nombre-variable[, nombre-variable, ...]> ] ; ... } [ <variables de estructura> ] ; Nota: recuerde que lo que se muestra entre corchetes es opcional. struct: Sintaxis ( variacin uno, estructura annima ) De acuerdo con la sintaxis general de la orden struct es posible crear estructuras de datos annimas. Solamente hay que tener en cuenta que en una declaracin annima se debe definir al menos una variable al final de la declaracin. Por ejemplo, con el siguiente fragmento de cdigo: struct { int a, b; } p1; se declara y define la variable estructurada p1, misma que se compone por los miembros a y b; ambos del tipo int. Ahora bien, la sintaxis mostrada arriba no es tan comn ni conveniente, ya que con la misma solamente se est creando una variable estructurada pero no un nuevo tipo. Es decir, si deseramos tener otra variable que tuviera las mismas caractersticas que posee la variable p1, necesitaramos escribir exactamente la misma instruccin, salvo que cambiando el nombre de la variable. Por ejemplo: struct { int a, b; } p2;
Las estructuras ya estaban presentes en C. Hay quien las ve como una clase, pero sin mtodos (solo almacena datos). Supongamos que queremos hacer una agenda con los nmeros de telfono de nuestros amigos. Necesitaramos un array de Cadenas para almacenar sus nombres, otro para sus apellidos y otro para sus nmeros de telfono. Esto puede hacer que el programa quede desordenado y difcil de seguir. Y aqu es donde vienen en nuestro auxilio las estructuras. Para definir una estructura usamos el siguiente formato: struct nombre_de_la_estructura { campos de estructura; }; NOTA: Es importante no olvidar el ';' del final. Vamos a crear una declaracion de estructura llamada amigo: struct estructura_amigo { char nombre[30]; char apellido[40]; char telefono[10]; char edad; };

A cada elemento de esta estructura (nombre, apellido, telfono) se le llama campo o miembro. Una vez definida la estructura, podemos usarla declarando una variable con esa estructura: struct estructura_amigo amigo; Ahora la variable amigo es de tipo estructura_amigo. Para acceder al nombre de amigo usamos: amigo.nombre. Arrays de estructuras Supongamos ahora que queremos guardar la informacion de varios amigos. Con una variable de estructura solo podemos guardar los datos de uno. Necesitamos declarar arrays de estructuras: struct estructura_amigo amigo[10]; Ahora necesitamos saber como acceder a cada elemento del array. La variable definida es amigo, por lo tanto para acceder al primer elemento usaremos amigo[0] y a su miembro nombre: amigo[0].nombre. Inicializar una estructura Primero se define la estructura y luego al declarar una variable como estructura le damos el valor inicial que queramos. Ejemplo: struct estructura_amigo amigo = { "Juanjo", "Lopez", "592-0483", 30 };

________________________________________ union: Sintaxis general union [ <nombre tipo de union > ] { <tipo> <lista de variables>; } [ <variables de union> ] ; De la misma manera que con la orden struct, con la orden union se pueden crear estructuras con nombre y estructuras sin nombre. El mecanismo de acceso a los miembros de una union es igual al mecanismo de acceso a los miembros de una struct. Los miembros de una union comparten un espacio de almacenamiento comn. En una union, el compilador reserva el espacio de almacenamiento para la misma de acuerdo con el el tipo de la variable de mayor tamao. Ejemplo: union annima union { short a; long b; } u1; En el ejemplo anterior se declara la variable u1, la cual es una estructura tipo union. El espacio de almacenamiento para la variable a es compartido por la variable b, en consecuencia, al escribir sobre cualquiera de estas dos variables se altera el contenido de ambas. Ejemplo: union con nombre union ux { short a; long b; } u1; En el ejemplo anterior se declara la variable u1, la cual es una estructura tipo union. El espacio de almacenamiento para la variable a es compartido por la variable b. Es decir, el compilador reservar espacio en la memoria para la variable de mayor tamao (que para ste caso es b). Ahora bin, suponiendo que en su equipo el tipo long ocupa 32 bits y que el tipo short ocupa 16 bits, entonces la variable a ocupar solamente los 16 bits menos significativos, miemtras que la variable b ocupar todo el espacio, o sea los 32 bits; Observe que en la sintaxis se ha especificado el nombre ux, mismo que puede ser empleado para declarar cualquier nmero de variables de la union. Por ejemplo, a continuacin se declaran las variables u2 y u3 del tipo union ux creado en el ejemplo anterior. union ux u2, u3

Hemos visto que las estructuras toman una parte de la memoria y se la reparten entre sus miembros. Cada miembro tiene reservado un espacio para l solo. El tamao total que ocupa una estructura en memoria es la suma del tamao que ocupa cada uno de sus miembros. Las uniones tienen un aspecto similar en cuanto a cmo se definen, pero tienen una diferencia fundamental con respecto a las estructuras: los miembros comparten el mismo trozo de memoria. El espacio que ocupa en memoria una unin es el espacio que ocupa el campo ms grande. Para entenderlo mejor vamos a ver un ejemplo: esta en la Diapositiva Creamos una unin y sus elementos son un nombre de 10 bytes (nombre[10]) y la inicial (1 byte). Como hemos dicho la unin ocupa el espacio de su elemento ms grande, en este caso nombre. Por lo tanto la unin ocupa 10 bytes. Las variables nombre e inicial comparten el mismo sitio de la memoria. Si accedemos a nombre estaremos accediendo a los primeros 10 bytes de la unin (es decir, a toda la unin), si accedemos a inicial lo que tendremos es el primer byte de la unin. ________________________________________ class: sintaxis <classkey> <classname> [<:baselist>] { <member list> } [lista de variables] ; <classkey> es una de las palabras "class", "struct", o "union". <baselist> lista de clas(es) base de donde se deriva esta clase. <baselist> es opcional. <member list> declara los datos miembros y funciones miembros de la clase. [lista de variables] esta entrada es opcional y se usa para instanciar variables u objetos de esta clase. Nota: Dentro de una clase, los datos son llamados "datos miembros" las funciones son llamadas "funciones miembros". El mecanismo para acceder a los miembros de una class es igual que aquel utilizado para acceder a los miembros de una struct Las clases son algo as como "super" estructuras capaces de agrupar no solo datos miembros sino tambin funciones miembros. En el lenguaje comn a los datos miembros de una clase se les conoce como atributos; mientras que a las funciones miembros de una clase se les llama mtodos. Normalmente, los mtodos se emplean para leer o escribir los atributos. Es decir, la norma general es no permitir el acceso directo a los atributos de una clase, con la idea de aumentar la seguridad de los datos. En seguida se mostrar el cdigo para crear la clase Pareja, misma que poseer los atributos a y b, y los mtodos setA(), setB(); getA(), getB(), y mostrar(); class Pareja { int a, b; public: void setA(int n) { a = n; } void setB(int n) { b = n; } int getA() { return a; } int getB() { return b; } void mostrar() { cout << "a = " << a << "; b = " << b << endl; } } p1; Nota: por omisin, los miembros de una clase son privados, lo cual significa que los objetos instanciados de dicha clase no tendrn acceso a los mismos. As, en el ejemplo anterior se est creando la clase Pareja, y al mismo tiempo el objeto

p1. Luego, para leer o escribir los atributos de p1 se debe hacer a traves de los mtodos definidos con tal objetivo. Por ejemplo, con el siguiente fragmento de cdigo se establecen respectivamente a 100 y a 200 los atributos a y b; y posteriormente se despliegan por medio del mtodo mostrar(). p1.setA(100); p1.setB(200); p1.mostrar(); Denicion de clases en C++ Desgraciadamente, la divisin entre interfaz e implementacin no es tan limpia en C++ como en el seudocdigo. Las clases se denen en C++ mediante una construccin class dividida en dos partes: una parte privada (private) que contiene algunos detalles de la implementacin, y una parte pblica (public) que contiene todo el interfaz. class NombreClase { private: // implementacion de la clase // solamente los atributos public: // interfaz de la clase }; En la parte privada de la construccin class aparecen slo los atributos de la clase y algunos tipos intermedios que puedan ser necesarios. En C++, la implementacin de los mtodos de la clase se facilita aparte. En la parte publica, suelen aparecer solamente las declaraciones (cabeceras) de los metodos de la clase. Por ejemplo, la siguiente es una denicion de la clase CComplejo que representa nmeros complejos: Esta en la diapositiva Los campos real e imag son los atributos de la clase y codican el estado de un objeto de la clase CComplejo. Puesto que los atributos estn declarados en la parte privada de la clase, forman parte de la implementacin y no es posible acceder a ellos desde fuera de la clase. Su acceso est restringido: slo se puede acceder a ellos en la implementacin de los mtodos de la clase. Los mtodos que aparecen en la parte pblica forman el interfaz de la clase y describen su comportamiento; es decir, las operaciones que podemos aplicar a un objeto del tipo CComplejo. En particular, con estos mtodos podemos asignar valores a las partes real e imaginaria, leer las partes real e imaginaria, y sumar dos nmeros complejos. Estructuras con funciones C++, permite incluir funciones en el interior de las estructuras. Normalmente estas funciones tienen la misin de manipular los datos incluidos en la estructura, y su uso est muy relacionado con la programacin orientada a objetos. El constructor de la clase: Una clase de constructor es una funcin miembro especial de una clase que se ejecuta cada vez que creamos nuevos objetos de esa clase. Un constructor tendr exactamente el mismo nombre que la clase y no tener ningn tipo de retorno en absoluto, ni siquiera vaco. Los constructores pueden ser muy tiles para establecer los valores iniciales para ciertas variables miembro. El Destructor Clase: Un destructor es una funcin miembro especial de una clase que se ejecuta cada vez que un objeto de su clase fuera de mbito o cuando la expresin delete se aplica a un puntero al objeto de esa clase.Un destructor tendr exactamente el mismo nombre que la clase precedido por una tilde (~), y no las puede devolver un valor, ni puede tener ningn parmetro. Destructor puede ser muy til para liberar recursos antes de salir del programa, como los archivos de cierre, la liberacin de memoria, etc.

You might also like