Sie sind auf Seite 1von 80

Programacin Orientada a Objetos

Apuntes del curso

Autor: Iliana Castillo Prez Agosto de 2012

ndice
Unidad I. Introduccin a la Programacin Orientada a Objetos
pgina

1.1 Definicin y caractersticas de Programacin Orientada a Objetos 1.2 C++ como lenguaje Orientado a Objetos 1.3 Del lenguaje C al C++ 1.4 Tipos de datos bsicos 1.5 Sentencias 1.6 Expresiones y operadores 1.6.1 Operadores Aritmticos 1.6.2 Operadores de Asignacin 1.6.3 Operadores de Manejo de Bits 1.6.4 Operadores Lgicos 1.6.7 Operadores Relacionales 1.6.8 Otros operadores 1.6.9 Operadores de Referencia e Indireccin 1.6.10 Operadores Aritmticos de incremento y decremento

3 4 5 6 9 10 10 11 12 12 12 13 14 14

Unidad II. Tipos de datos Abstractos 2.1 Manejo del problema 2.2 Propiedad de los tipos de datos abstractos 2.3 Tipos de datos abstractos y genricos 2.4 Tipos de datos abstractos y la Orientacin a Objetos 2.5 Categoras de Operaciones con TDAs
16 18 19 20 21

Unidad III. Fundamentos de C++ 3.1 Mecanismos bsicos 3.1.1 Objetos 3.1.2 Mensajes 3.1.3 Mtodos 3.1.4 Clases de objetos 3.1.5 Subclases 3.2 Caractersticas relevantes 3.2.1 Abstraccin 3.2.2 Encapsulamiento 3.2.3 Herencia 3.2.4 Herencia mltiple 3.2.5 Polimorfismo 3.2.6 Concurrencia 3.2.7 Persistencia 3.3 Ventajas Orientadas a Objetos
22 22 23 23 24 26 27 27 28 28 28 28 29 29 29
i

Unidad IV. Las clases de Objetos 4.1 Definicin 4.2 Secciones de una clase 4.3 Reglas de las Secciones de la Clase 4.4 Ejemplos de Clases 4.5 Constructores 4.5.1 Constructor por omisin (implcito) 4.5.2 Constructor explcito con argumentos 4.5.3 Constructor explcito con argumentos por omisin 4.5.4 Constructor copia 4.5.5 Constructor explcito 4.6 Destruccin de Objetos 4.7 Puntero This 4.8 El operador new 4.8.1 Manejo de Memoria Dinmica 4.8.2 Apuntadores a Objetos 4.9 Miembros estticos 4.10 Funciones en lnea 4.11 Sobrecarga de Funciones 4.12 Sobrecarga de Mtodos 4.13 Funciones amigas

pgina 30 30 31 31 37 37 38 40 41 42 44 48 48

51 54 55 56 57

Unidad V. Sobrecarga de Operadores 5.1. Operadores Unarios 5.2. Operadores Binarios 5.3. Sobrecarga de operadores
61 61 62

Unidad VI. Relaciones entre Clases 6.1 Herencia Simple 6.1.1 Tipos de Acceso 6.2 Composicin
67 68 73

Unidad VII. Manejo de Archivos 7.1 Archivos de texto 7.2 Archivos con objetos
78

ii

Introduccin a la Programacin Orientada a Objetos

Unidad I. Introduccin a la Programacin Orientada a Objetos


Definicin y caractersticas de Programacin Orientada a Objetos Cuando miramos a nuestro alrededor en el mundo real, a donde quiera que volteemos podemos ver objetos, gente, animales, plantas, automviles, edificios, computadoras, etc. Los humanos pensamos en trminos de objetos. Tenemos la maravillosa habilidad de abstraccin que nos permite ver imgenes en pantalla como objetos tales como gente, aviones, rboles y montaas, en lugar de puntos individuales de color. Podemos, si lo deseamos, pensar en trminos de playas en vez de granos de arena, bosques en vez de rboles y casa en lugar de ladrillos. Quiz nos inclinamos a dividir los objetos en dos categoras: objetos animados y objetos inanimados. Los objetos animados estn vivos de alguna manera. Se mueven y hacen cosas. Los objetos inanimados, como las toallas, parecen no hacer nada en absoluto, parecen slo estar ah, sin embargo, todos los objetos tienen algo en comn. Todos tienen atributos, como tamao, forma, color, peso, etc., que los describen. Todos exhiben un comportamiento, o realizan operaciones (por ejemplo, una pelota rueda, rebota, se infla y se desinfla; un beb llora, duerme, gatea, camina y parpadea; un automvil acelera, frena, gira; una toalla absorbe agua, etc.) que especifican lo que hacen. La programacin orientada a objetos (POO), expresa un programa como un conjunto de objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y mdulos ms fciles de escribir, mantener y reutilizar. La POO encapsula datos (atributos) y funciones (operaciones) en paquetes llamados objetos; los datos y las funciones de un objeto estn ntimamente ligados. Los objetos tienen la propiedad de ocultar informacin. Esto significa que aunque los objetos pueden saber como comunicarse a travs de interfaces bien definidas, por lo general, los objetos no saben cmo se implementan otros objetos, los detalles de implementacin se ocultan dentro de los mismos objetos. Con seguridad, es posible manejar un automvil de manera efectiva sin tener que conocer a fondo los detalles de cmo funcionan internamente los sistemas del motor y la transmisin. El ocultamiento de informacin es crucial para la buena ingeniera de software. De esta forma, un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interaccin llamados mtodos que favorecen la comunicacin entre ellos. Esta comunicacin favorece a su vez el cambio de estado en los propios objetos. Esta caracterstica lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado y el comportamiento.
M. en C. Iliana Castillo Prez

Pgina 3

Introduccin a la Programacin Orientada a Objetos

Las principales caractersticas de la Programacin Orientada a Objetos son: Abstraccin Encapsulamiento Polimorfismo Herencia Herencia mltiple Concurrencia Persistencia

C++ como lenguaje Orientado a Objetos C++ es un lenguaje de programacin de propsito general basado en el lenguaje de programacin C, con la caracterstica de que ha sido diseado para mejorar las caractersticas de C as como implementar la abstraccin de datos por medio de programacin orientada a objetos. El rediseo del lenguaje C con clases dio origen al nuevo lenguaje C++, utilizando extensiones tales como funciones virtuales, funciones sobrecargadas y operadores sobrecargados. Posteriormente sufri otro refinamiento creado y documentado por Bjarne Stroustrup quedando disponible en 1985. El nombre de C++ se debe a Rick Mascitti, el cual utiliza el ++ para indicar la evolucin de C, ya que como sabemos en C el operador ++ significa incremento.

Un tipo de datos primitivo importante que implementa C++ es el de class y los nombres asociados para referirse a los conceptos: CONCEPTO Objeto Clase Superclase subclase Mtodo Variables asociadas Variables de la clase Mensaje Herencia C++ Objeto Tipo definido por el usuario(clase) Clase base Clase derivada Definicin de la funcin miembro Datos miembro Datos miembro static Declaracin de la funcin miembro Derivacin

M. en C. Iliana Castillo Prez

Pgina 4

Introduccin a la Programacin Orientada a Objetos

Del lenguaje C al C++ A finales de la dcada de 1960 y principios de la de 1970, Dennis Ritchie cre el lenguaje de programacin C en AT&T Bell Labs. En aquella poca, un grupo de personas en los laboratorios Bell estaba diseando el sistema operativo UNIX. Al inicio, UNIX se escriba en lenguaje ensamblador, como era costumbre para casi todo el software de sistema en esos das. Para evitar las dificultades de programar en lenguaje ensamblador, Ritchie invent C como un lenguaje de programacin de sistema. C combina las caractersticas de bajo nivel de un lenguaje ensamblador con la facilidad de uso y portabilidad de un lenguaje de alto nivel. UNIX se reprogram de modo que casi 90% se escribi en C y el resto en lenguaje ensamblador. Las personas suelen preguntarse de donde viene el enigmtico nombre de C. En la dcada de 1960 un lenguaje de programacin denominado BCPL (Basic Combined Programming Language) tuvo un seguimiento pequeo pero leal. De BCPL surgi otro lenguaje con B como abreviatura para su nombre. Para su lenguaje, Dennis Ritchie adopt caractersticas del lenguaje B y decidi que el sucesor de B debera nombrarse C. En 1985 Bjarne Stroustrup, tambin de laboratorios Bell, invent el lenguaje de programacin C++. Aadi al lenguaje C caractersticas de abstraccin de datos y programacin orientada a objetos y en lugar de nombrarlo lenguaje D, el grupo de laboratorios Bell de una manera humorstica lo nombr C++, ya que ++ significa la operacin de incremento en los lenguajes C y C++, por lo que el nombre C++ hace pensar en una versin mejorada (incrementada) del lenguaje C. Desde los aos en que el doctor Stroustrup invent C++, el lenguaje comenz a evolucionar en formas un poco diferentes en distintos compiladores de C++. Aunque las caractersticas fundamentales de C++ fueron casi las mismas en los componentes de las empresas, una compaa poda aadir una nueva caracterstica del lenguaje, mientras que otra no. Como resultado, los programas de C++ no siempre fueron transportables de un compilador al siguiente. La comunidad dedicada a la programacin acord que el lenguaje necesitaba ser estandarizado, y un comit conjunto de la Internacional Standards Organization (ISO) y el American National Standards Institute (ANSI) comenz el largo proceso de crear un estndar del lenguaje C++. Despus de varios aos de anlisis y debate, el estndar de lenguaje ISO/ANSI para C++ se aprob de manera oficial a mediado de 1998.

M. en C. Iliana Castillo Prez

Pgina 5

Introduccin a la Programacin Orientada a Objetos

Una particularidad del C+.+ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crear nuevos tipos que se comporten como tipos fundamentales. Tipos de datos bsicos En C slo existen cinco tipos fundamentales y los tipos enumerados, C++ aade un sptimo tipo, el bool, y el resto de los tipos son derivados de ellos. Para crear un identificador hay que tener en cuenta algunas reglas, no es posible usar cualquier cosa como identificador. Slo se pueden usar letras (maysculas o minsculas), nmeros y ciertos caracteres no alfanumricos, como el '_', pero nunca un punto, coma, guin, comillas o smbolos matemticos o interrogaciones. El primer carcter no puede ser un nmero. C y C++ distinguen entre maysculas y minsculas, de modo que los identificadores nmero y Nmero son diferentes. Ejemplo: signed char Cuenta; unsigned char letras; char carcter; Char (Carcter) Es el tipo bsico alfanumrico, es decir que puede contener un carcter, un dgito numrico o un signo de puntuacin. En C y C++ este tipo siempre contiene un nico carcter del cdigo ASCII. El tamao de memoria es de 1 byte. Hay que notar que en C un carcter es tratado en todo como un nmero, de hecho puede ser declarado con y sin signo. Y si no se especifica el modificador de signo, se asume que es con signo. Este tipo de variables es apto para almacenar nmeros pequeos, como los dedos que tiene una persona, o letras, como la inicial de mi nombre de pila. Int (Entero) Las variables enteras almacenan nmeros enteros dentro de los lmites de su tamao, a su vez, ese tamao depende de la plataforma del compilador, y del
M. en C. Iliana Castillo Prez

Pgina 6

Introduccin a la Programacin Orientada a Objetos

nmero de bits que use por palabra de memoria: 8, 16, 32... No hay reglas fijas para saber el mayor nmero que podemos almacenar en cada tipo: int, long int o short int; depende en gran medida del compilador y del ordenador. Slo podemos estar seguros de que ese nmero en short int es menor o igual que en int, y ste a su vez es menor o igual que en long int y que long long int es mayor o igual a long int. Veremos cmo averiguar estos valores cuando estudiemos los operadores. Las variables de este tipo permite almacenar nmeros relativamente grandes, pero sin decimales. Float (Punto Flotante) Las variables de este tipo almacenan nmeros en formato de coma flotante, mantisa y exponente, para entendernos, son nmeros con decimales. Son aptos para variables de tipo real. O para nmeros muy grandes, como la produccin mundial de trigo, contada en granos. El fuerte de estos nmeros no es la precisin, sino el orden de magnitud, es decir lo grande o pequeo que es el nmero que contiene. Por ejemplo, la siguiente cadena de operaciones no dar el resultado correcto: float a = 12335545621232154; a = a + 1; a = a - 12335545621232154; Finalmente, "a" valdr 0 y no 1, como sera de esperar. Los formatos en punto flotante sacrifican precisin en favor de tamao. Sin embargo el ejemplo si funcionara con nmeros ms pequeos. Bool (Booleana) Las variables de este tipo slo pueden tomar dos valores "true" o "false". Sirven para evaluar expresiones lgicas. Este tipo de variables se puede usar para almacenar informacin que slo pueden tomar dos valores. bool respuesta; bool continuar;

M. en C. Iliana Castillo Prez

Pgina 7

Introduccin a la Programacin Orientada a Objetos

Nota: En algunos compiladores antiguos de C++ no existe el tipo bool. Lo lgico sera no usar esos compiladores, y conseguir uno ms actual. Pero si esto no es posible se puede simular este tipo a partir de un enumerado. enum bool {false=0, true}; Double (Punto Flotante De Doble Precisin) Las variables de este tipo almacenan nmeros en formato de punto flotante, mantisa y exponente, al igual que float, pero usan mayor precisin. Son aptos para variables de tipo real. Usaremos estas variables cuando trabajemos con nmeros grandes, pero tambin necesitemos gran precisin. Void (Sin Tipo) Es un tipo especial que indica la ausencia de tipo. Se usa en funciones que no devuelven ningn valor, tambin en funciones que no requieren parmetros, aunque este uso slo es obligatorio en C, y opcional en C++, tambin se usar en la declaracin de punteros genricos, Enum (Enumerado) enum [<identificador_de_enum>] [lista_de_variables];

<nombre>

[=

<valor>],

...}

Este tipo nos permite definir conjuntos de constantes, normalmente de tipo int, llamados datos de tipo enumerado. Las variables declaradas de este tipo slo podrn tomar valores entre los definidos. El identificador de tipo es opcional, y nos permitir declarar ms variables del tipo enumerado en otras partes del programa: [enum] <identificador_de_enum> <lista_de_identificadores>; La lista de variables tambin es opcional. Sin embargo, al menos uno de los dos componentes opcionales debe aparecer en la definicin del tipo enumerado. Varios identificadores pueden tomar el mismo valor, pero cada identificador slo puede usarse en un tipo enumerado. Por ejemplo: enum tipohoras { una=1, dos, tres, cuatro, cinco, seis, siete, ocho, nueve, diez, once, doce, trece=1, catorce, quince,
M. en C. Iliana Castillo Prez

Pgina 8

Introduccin a la Programacin Orientada a Objetos

dieciseis, diecisiete, dieciocho, diecinueve, veinte, veintiuna, ventidos, veintitrs, veinticuatro = 0}; En este caso, una y trece valen 1, dos y catorce valen 2, etc., y veinticuatro vale 0. Como se ve en el ejemplo, una vez se asigna un valor a un elemento de la lista, los siguientes toman valores correlativos. Si no se asigna ningn valor, el primer elemento tomar el valor 0. Los nombres de las constantes pueden utilizarse en el programa, pero no pueden ser ledos ni escritos. Por ejemplo, si el programa en un momento determinado nos pregunta la hora, no podremos responder doce y esperar que se almacene su valor correspondiente. Del mismo modo, si tenemos una variable enumerada con el valor doce y la mostramos por pantalla, se mostrar 12, no doce. Deben considerarse como "etiquetas" que sustituyen a enteros, y que hacen ms comprensibles los programas. Insisto en que internamente, para el compilador, slo son enteros, en el rango de valores vlidos definidos en cada enum. Resuminendo: char int enum float double bool void 8 bits 32 bits 16 bits 32 bits 64 bits -128 a 127 -2,147,483,648 a 2,147,483,647 -2,147,483,648 a 2,147,483,647 3.4*10-38 a 3.4*10+38 (6 dec) 1.7*10-308 a 1.7*10+308 (15 dec)

Sentencias Existen sentencias de varios tipos, que nos permitirn enfrentarnos a todas las situaciones posibles en programacin. Estos tipos son: Bloques Expresiones o Llamada a funcin o Asignacin o Nula Bucles o while o do while o for Etiquetas
M. en C. Iliana Castillo Prez

Pgina 9

Introduccin a la Programacin Orientada a Objetos

o Etiquetas de identificacin o case o default Saltos o break o continue o goto o return Seleccin o if...else o switch

Expresiones y operadores Los operadores son elementos que disparan ciertos clculos cuando son aplicados a variables o a otros objetos en una expresin. Variable: es un valor que almacena nuestro programa que puede cambiar a lo largo de su ejecucin. Expresin: segn el diccionario, "Conjunto de trminos que representan una cantidad", entre nosotros es cualquier conjunto de operadores y operandos, que dan como resultado una cantidad. Operando: cada una de las cantidades, constantes, variables o expresiones que intervienen en una expresin. Existe una divisin en los operadores atendiendo al nmero de operandos que afectan. Segn esta clasificacin pueden ser unitarios, binarios o ternarios, los primeros afectan a un solo operando, los segundos a dos y los ternarios a tres. Hay varios tipos de operadores, clasificados segn el tipo de objetos sobre los que actan.

Operadores Aritmticos Los operadores aritmticos se usan para realizar clculos de aritmtica de nmeros reales y de aritmtica de punteros. C++ dispone de los siguientes:
M. en C. Iliana Castillo Prez

Pgina 10

Introduccin a la Programacin Orientada a Objetos

Nombre del operador Ms unitario Suma Preincremento Postincremento Menos unitario (negacin) Resta Predecremento Postdecremento Multiplicacin Divisin Mdulo (Resto)

Sintaxis +a a+b ++a a++ -a a-b --a a-a*b a/b a%b

Operadores de Asignacin C++ cuenta con varios operadores de asignacin para abreviar las expresiones de asignacin. Dichos operadores son los siguientes: Operador Nombre del operador = *= /= %= += -= <<= >>= &= ^= |= Asignacin Asigna producto Asigna divisin Asigna resto (mdulo) Asigna suma Asigna diferencia (resta) Asigna desplazamiento izquierda Asigna desplazamiento derecha Asigna AND entre bits Asigna XOR entre bits Asigna OR entre bits

M. en C. Iliana Castillo Prez

Pgina 11

Introduccin a la Programacin Orientada a Objetos

Operadores de manejo de Bits C++ dispone de 6 operadores para manejo de bits que realizan dos tipos de operaciones. Son los siguientes: Operador ~ << >> & ^ | Nombre del operador Complemento a uno Desplazamiento a izquierda Desplazamiento a derecha AND; compara dos bits XOR (OR exclusivo); compara dos bits OR inclusivo; compara dos bits

Operadores lgicos Los operadores lgicos producen un resultado booleano, y sus operandos son tambin valores lgicos o asimilables a ellos (los valores numricos son asimilados a cierto o falso segn su valor sea cero o distinto de cero). Los operadores lgicos son tres; dos de ellos son binarios, el ltimo (negacin) es unario. Operador && || Nombre del operador AND (Y lgico) OR (O lgico) NOT (Negacin lgica)

Las expresiones conectadas con los operadores && y || se evalan de izquierda a derecha, y la evaluacin se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una lgica que se basa en este propiedad). Operadores relacionales Los operadores relacionales, tambin denominados operadores binarios lgicos y de comparacin, se utilizan para comprobar la veracidad o falsedad de determinadas propuestas de relacin (en realidad se trata respuestas a preguntas). Las expresiones que los contienen se denominan expresiones relacionales. Aceptan diversos tipos de argumentos, y el resultado, que es la
M. en C. Iliana Castillo Prez

Pgina 12

Introduccin a la Programacin Orientada a Objetos

respuesta a la pregunta, es siempre del tipo cierto/falso, es decir, producen un resultado booleano Si la propuesta es cierta, el resultado es true (un valor distinto de cero), si es falsa false (cero). Nombre del operador Menor que Menor o igual que Mayor que Mayor o igual que No igual que Igual que Otros operadores Nombre del operador Llamada a funcin ndice de Array Indireccin (Desreferencia) Direccin de (Referencia) Miembro de puntero Miembro Desreferencia a miembro por puntero Desreferencia a miembro por objeto Conversin de tipo Condicional ternario Resolucin de mbito Tamao de Asignar almacenamiento Asignar almacenamiento (Vector) Desasignar almacenamiento Desasignar almacenamiento (Vector) Sintaxis a() a[b] *a &a a->b a .b a->*b a.*b (tipo) a a?b:c a::b sizeof a sizeof(tipo) new tipo new tipo[n] delete a delete[ ] a Sintaxis a<b a <= b a>b a >= b a != b a == b

M. en C. Iliana Castillo Prez

Pgina 13

Introduccin a la Programacin Orientada a Objetos

Operadores de Referencia e Indireccin El operador de referencia (&) nos devuelve la direccin de memoria del operando. Sintaxis: & <expresin simple> El operador de indireccin (*) considera a su operando como una direccin y devuelve su contenido. Sintaxis: * <puntero>

Operadores Aritmticos de incremento y decremento (++ y --) Ya que estos operadores tienen un uso frecuente y especial los retomaremos en este punto mostrando lo que pueden hacer. Un requisito comn en los programas es sumar o restar 1 al valor de una variable. Esto se hace utilizando el operador + de la siguiente manera: edad = edad + 1; No obstante, aumentar o reducir un valor en incrementos o decrementos de 1 es una operacin tan comn que existen operadores unarios para realizarla: los operadores de incremento (++) y decremento (--). Estos operadores pueden aplicarse antes (preincremento y predecremento) o despus (posincremento y posdecremento) de la variable. La lnea de cdigo anterior, en la que la edad iba aumentando en incrementos de uno tambin puede escribirse de la forma siguiente: edad++; o ++edad;

Se debe utilizar estos operadores con precaucin en las expresiones. Si se utilizan como prefijo, la operacin (incremento o decremento) se aplica antes de cualquier clculo o asignacin posterior. En su forma se sufijo, la operacin se aplica despus de los sucesivos clculos u operaciones, de forma que en los clculos o asignaciones posteriores se utiliza el valor original, no el valor actualizado. En la tabla siguiente se muestra el uso de los operadores de incremento y decremento.
M. en C. Iliana Castillo Prez

Pgina 14

Introduccin a la Programacin Orientada a Objetos

Operador ++

Finalidad Preincremento (++variable)

Ejemplo int i = 6; int j = ++i; i es 7, j es 7 int i = 6; int j = i++; i es 7, j es 6 int i = 6; int j = --i; i es 5, j es 5 int i = 6; int j = i--; i es 5, j es 6

Notas

Posincremento (variable++)

El valor de I se asigna a j antes de incrementar i. Por lo tanto, j recibe el valor 6.

--

Predecremento (--variable)

Posdecremento (variable--)

El valor de I se asigna a j antes de decrementar i. Por lo tanto, j recibe el valor 6.

En el ejemplo siguiente se muestra un uso bsico de los operadores de incremento y decremento: int contador = 15; int a, b, c, d; a= contador++; b = contador; c=++contador; d=contador; cout<<Salida: <<a<<, <<b<<, <<c<<, <<d<<endl; El resultado de este fragmento de cdigo sera: 15, 16, 17, 17

M. en C. Iliana Castillo Prez

Pgina 15

Tipos de Datos Abstractos

Unidad II. Tipos de datos Abstractos


Manejo del problema La primera cosa con la que uno se enfrenta cuando se escriben programas es el problema. Tpicamente nos enfrentamos a problemas de la vida real y generalmente deseamos facilitarnos la existencia por medio de un programa para dicho problema, sin embargo los problemas de la vida real son nebulosos, y la primera cosa que tenemos que hacer es tratar de entender el problema para separar los detalles esenciales de los no esenciales tratando de obtener nuestra perspectiva abstracta o modelo del problema; a ste proceso de modelado se le llama ABSTRACCIN.

El modelo define una perspectiva abstracta del problema esto implica que el modelo se enfoque solamente en aspectos relacionados con el problema y que tratemos de definir propiedades del problema, estas incluyen: 1.- Los datos que son afectados 2.- Las operaciones que son identificadas por el problema

M. en C. Iliana Castillo Prez

Pgina 16

Tipos de Datos Abstractos

Ejemplo: Si queremos modelar un automvil y determinar que puede hacer: Motor Gasolina Velocidad Luces Tipo(estndar/Autom) Caractersticas(Datos) Encender() Apagar() Avanzar() Frenar() DarVuelta() Operaciones

Automvil

Para resumir la abstraccin es la estructuracin de un problema nebuloso en entidades bien definidas por medio de la definicin de sus datos y operaciones. Consecuentemente estas entidades combinan datos y operaciones, no estn desacoplados unos de otros. Adems se puede describir la abstraccin de datos como la separacin de las propiedades lgicas de un tipo de dato de sus detalles de implementacin. La abstraccin de datos participa cuando se requiere un tipo de dato que no forma parte del lenguaje de programacin. Se puede definir el nuevo tipo de dato como un tipo de dato abstracto (TDA). Si se centra la atencin solo en sus propiedades lgicas y se posponen los detalles de su implementacin.

Como ya se mencion, los lenguajes de Programacin Orientados a Objetos son lenguajes formados por diferentes mtodos o funciones y que son llamados en el orden en que el programa lo requiere, o el usuario lo desea. La abstraccin de datos consiste en ocultar las caractersticas de un objeto y obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro programa. Esto es similar a una situacin de la vida cotidiana. Cuando yo digo la palabra perro, usted no necesita que yo le diga lo que hace el perro. Usted ya sabe la forma que tiene un perro y tambin sabe que los perros ladran. De manera que yo abstraigo todas las caractersticas de todos los perros en un solo trmino, al cual llamo perro. A esto se le llama Abstraccin y es un concepto muy til en la programacin, ya que un usuario no necesita mencionar todas las caractersticas y funciones de un objeto cada vez que ste se utiliza, sino que son declaradas por separado en el programa y simplemente se utiliza el trmino abstr acto (perro) para mencionarlo.

M. en C. Iliana Castillo Prez

Pgina 17

Tipos de Datos Abstractos

Ejemplo de un TDA Lista: TIPO Lista DOMINIO Los valores de la lista son nmeros enteros. OPERACIONES Insertar un elemento en la lista. Borrar un elemento de la lista Buscar un elemento de la lista Ordenar la lista Devolver la longitud de la lista Imprimir la lista Propiedad de los tipos de datos abstractos Por medio de la abstraccin se crea una entidad bien definida que puede ser adecuadamente manejada. Esta entidad define la estructura de datos de un conjunto de elementos. La estructura de datos puede ser accesada solamente por medio de operaciones definidas, este conjunto de operaciones es llamado INTERFASE y es exportada por la entidad. Una entidad con las propiedades recin descritas se conoce como un tipo de dato abstracto (TDA). La Figura muestra un TDA que consiste en una estructura de datos abstracta y operaciones. Solamente las operaciones son visibles desde afuera y definen la interfase.

Cuando la estructura de datos es llenada con valores reales se crea una instancia.

M. en C. Iliana Castillo Prez

Pgina 18

Tipos de Datos Abstractos

Definicin formal Un tipo de dato abstracto (TDA) se caracteriza por las siguientes propiedades: 1) Exporta un tipo. 2) Exporta un conjunto de operaciones. Este conjunto es llamado interfase. 3) Las operaciones de la interfase son el nico y exclusivo mecanismo de acceso a la estructura de datos del TDA. 4) Axiomas y precondiciones definen el mbito de aplicacin del TDA.

Tipos de datos abstractos y genricos Los TDAs se usan para definir un nuevo tipo a partir del cual se pueden crear instancias, algunas veces estas instancias deberan operar del mismo modo sobre otros tipos de datos. Notacin: Debido a que los TDAs proveen una perspectiva abstracta para describir propiedades de conjuntos de entidades, su uso es independiente de un lenguaje de programacin en particular.

Toda descripcin de TDAs consiste en dos partes: 1) Datos: Describe la estructura de los datos usada en el TDA de una manera informal. 2) Operaciones: Describe las operaciones vlidas para este TDA, por lo tanto describe su interface.

Usamos la operacin especial constructor para describir las acciones que se van a ejecutar una vez que una entidad de este TDA es creada y destructor para describir las acciones que se van a efectuar cuando una entidad es destruida. Para cada Operacin se determinan previamente los argumentos que sern necesarios para efectuar correctamente las operaciones, as como establecer las precondiciones y postcondiciones.

M. en C. Iliana Castillo Prez

Pgina 19

Tipos de Datos Abstractos

Tipos de Datos Abstractos y la Orientacin a Objetos Los TDAs permiten la creacin de instancias con propiedades y comportamiento bien definidos. En orientacin a objetos nos referimos a los TDAs como clases, por lo tanto una clase define las propiedades de objetos instancia en un ambiente orientado a objetos. Los TDAs definen la funcionalidad al poner especial nfasis en los datos involucrados, su estructura, operaciones, as como en precondiciones y postcondiciones. Consecuentemente la POO es programacin con TDAs al combinar la funcionalidad de distintos TDAs para resolver un problema. Por lo tanto, instancias (objetos) de TDAs (clases) son creados dinmicamente, usados y destruidos. Ejemplo de un TDA Lista con precondiciones y postcondiciones: TIPO Lista DOMINIO Los valores de la lista son nmeros enteros. OPERACIONES precondicin: Verificar si hay lugar en la lista (longitud-1). Insertar postcondicin: Lista con una elemento ms. (Longitud + 1). precondicin: Lista con al menos un elemento. Borrar postcondicin: Lista con un elemento menos (longitud 1) precondicin: Conocer el elemento a buscar, lista con al menos 1 elemento. postcondicin: Posicin del elemento en la lista.

Buscar

precondicin: Que la lista exista y tenga al menos Devolver la 1 elemento. longitud de la lista postcondicin: Posicin del ltimo elemento en la lista.

M. en C. Iliana Castillo Prez

Pgina 20

Tipos de Datos Abstractos

Categoras de operaciones con TDAs En general, las operaciones bsicas relacionadas con los tipos de datos abstractos son de 3 categoras: constructors (constructores) transformers (transformadores) observers (observadores) Una operacin que crea un nuevo caso de TDA es un constructor. Las operaciones que insertan un elemento o borran un elemento son transformadores. Una operacin que toma una lista la anexa al final de una segunda lista es tambin un transformador. Una operacin que permite observar el estado de un caso de un TDA sin cambiarlo es un observador. Una funcin booleana que devuelve true si est vaca una lista y false si contiene algn elemento, es un ejemplo de un observador. Una funcin booleana que prueba si determinado valor est en la lista es otro observador. Algunas operaciones son combinaciones de observadores y constructores. Una operacin que toma dos listas y las combina en una 3er lista (nueva) es tanto un observador (de las dos listas existentes) como un constructor (de la 3er lista). Adems de las 3 categoras bsicas de operaciones de TDA, en ocasiones se define una cuarta: iterators (iteradores). Un ejemplo de un iterador es una operacin que devuelve el primer elemento de una lista que es llamada inicialmente y devuelve el siguiente con cada llamada sucesiva. En resumen, existen las siguientes categoras: Constructor: Operacin que crea un nuevo caso (variable) de un TDA. Transformador: Operacin que determina un nuevo valor del TDA, dados uno o ms valores previos del tipo. Observador: Operacin que permite observar el estado de un caso de un TDA sin cambiarlo. Iterador: Operacin que permite procesar, uno a la vez, los componentes en un caso de un TDA.

M. en C. Iliana Castillo Prez

Pgina 21

Fundamentos de C++

Unidad III. Fundamentos de C++

Mecanismos bsicos La POO es una forma de programacin que utiliza objetos que corresponden a sucesos. Estos sucesos producen un flujo de mensajes entre los objetos, lo que origina cambios en el estado del objeto que recibe el mensaje. Los mecanismos bsicos de la POO son: objetos, mensajes, mtodos, clases y subclases. Objetos En C++ un objeto es un elemento declarado de un tipo clase. Se conoce tambin como una instancia de una clase. Un objeto es una encapsulacin genrica de datos y de los procedimientos para manipularlos. Dicho de otra forma, es una entidad que tiene unos atributos particulares (los datos) y unas formas de operar sobre ellos (los mtodos). Por lo tanto, un objeto contiene por una parte operaciones que definen su comportamiento y por otra variables manipuladas por esas operaciones que definen su estado. Ejemplo: Celular Pantalla Teclado Nivel_seal Memoria Bluetooth Encender() Apagar() Llamar() Vibrar() Enviar_mnsj() Automvil Velocidad Motor Transmisin Velocimetro Nivel_gasolina Encender() Apagar() Avanzar() Frenar() Acelerar()

M. en C. Iliana Castillo Prez

Pgina 22

Fundamentos de C++

Mensajes Cuando se ejecuta un Programa Orientado a Objetos, lo objetos estn recibiendo, interpretando y respondiendo a mensajes de otros objetos. En la POO el paso de mensajes entre objetos origina cambios en el estado del objeto. Por ejemplo, cuando un usuario enva un mensaje a un objeto denominado printer para que escriba un documento, printer puede enviar un mensaje a otro objeto denominado cola_impre para que le asigne un lugar en la cola de trabajos de impresin. A su vez, cola_impre, puede enviar un mensaje a printer para requerirle informacin que posibilite dar formato al documento, y as sucesivamente. Un mensaje puede incluir informacin para clarificar una peticin. Por ejemplo, el mensaje enviado a printer puede incluir el nombre de la impresora. Finalmente, cuando un objeto recibe un mensaje, debe conocer perfectamente lo que tiene que hacer, y cuando un objeto enva un mensaje, no necesita conocer cmo se desarrollar, sino simplemente que se est desarrollando. El conjunto de mensajes a los que un objeto puede responder se denomina protocolo. En C++, un mensaje est asociado con el prototipo de una funcin miembro de tal forma que cuando se produce ese mensaje, se ejecuta la funcin miembro correspondiente, de la clase a la que pertenece el objeto. Esto es, el envo de un mensaje equivale en C++ a llamar a una funcin miembro.

Mtodos Un mtodo (que en C++ se denomina funcin miembro) se implementa en una clase, y determina cmo tiene que actuar el objeto cuando recibe un mensaje. En adicin, las variables asociadas o atributos permitirn almacenar informacin para dicho objeto. Un mtodo puede tambin enviar mensajes a otros objetos solicitando una accin o informacin. La descripcin de un mtodo se denomina operacin.

En C++, un mtodo corresponde con la definicin de la funcin miembro de una clase.

M. en C. Iliana Castillo Prez

Pgina 23

Fundamentos de C++

Objeto

Mensajes

Atributos Mtodos

La estructura ms interna de un objeto est oculta para otros usuarios y la nica conexin que tiene con el exterior son los mensajes. Los atributos (datos) que oculta un objeto, solamente pueden ser manipulados por los mtodos asociados al propio objeto. Segn lo expuesto, la ejecucin de un programa orientado a objetos realizar fundamentalmente tres cosas: 1. Crear los objetos necesarios. 2. Los mensajes enviados a unos y otros objetos darn lugar a que se procese internamente la informacin. 3. Finalmente, cuando los objetos no son necesarios, sern borrados, liberndose la memoria ocupada por los mismos.

Clases Una clase se puede considerar como un plantilla para crear objetos de esa clase o tipo. Una clase describe los mtodos y atributos que definen las caractersticas comunes a todos los objetos de esa clase. Precisamente la clave de la programacin orientada a objetos est en abstraer los mtodos y atributos comunes a un conjunto de objetos y encapsularlos en una clase. Una clase es un tipo de objeto definido por el usuario. En otras palabras, una clase equivale a la generalizacin de un tipo especfico de objeto. Un objeto es la concrecin de una clase (instancia). Ejemplo: consideremos el diseo de un procesador de textos utilizando la POO. Primero, identificamos entidades de inters como prrafos, cabeceras, pies, etc., las cuales pueden ser objetos potenciales. A continuacin analizamos estas entidades; por ejemplo, un prrafo normalmente est justificado, lo que quiere decir que podemos pensar en un mtodo, que podemos llamar justificacin, comn a todos los prrafos.

M. en C. Iliana Castillo Prez

Pgina 24

Fundamentos de C++

Normalmente, en un documento, todos los prrafos se escriben con el mismo tipo de letra, entonces fuente es un atributo comn para todos los prrafos. Un prrafo est formado por su propio texto, entonces texto es un atributo que tendr un valor especfico para cada prrafo. Podemos agrupar la descripcin comn a los prrafos, formando as la clase prrafo, la cual nos permitir construir objetos de esta clase; esto es, prrafos. Clase prrafo

Atributo de la clase

Fuente = Arial

Atributo asociado al objeto Mtodo

Texto = Justificacin

parrafo1 Cuando se ejecuta un programa orientado a objetos


Objetos de la clase prrafo

parrafo2 Consideremos como se puede disear

Un atributo asociado con una clase representa un valor que es compartido por todos los objetos de esa clase; esto es, slo existe una copia de ese atributo (en C++ este tipo de atributo recibe el nombre de dato miembro static). En cambio, un atributo asociado a un objeto de una clase representa un valor particular a ese objeto; esto es, cada objeto tiene su propia copia (en C++ este tipo de atributo recibe el nombre de dato miembro). Para crear un objeto de una determinada clase simplemente hay que declarar una variable de dicha clase. Por ejemplo, la siguiente declaracin crea el objeto parrafo1 en C++: parrafo parrafo1;
M. en C. Iliana Castillo Prez

Pgina 25

Fundamentos de C++

Si ms adelante quisiramos justificar el texto de parrafo1, tendramos que enviarle el mensaje justificacin, o lo que es lo mismo, invocaramos a la funcin justificacin as: parrafo1.justificacin( ); Recordando lo expuesto anteriormente, en C++ el prototipo de la funcin justificacin corresponde con el mensaje, y la definicin con el mtodo. Subclases Una caracterstica primaria que define un sistema orientado a objetos es la manera en que trata las relaciones estructurales y semnticas entre clases de objetos y elimina la redundancia de almacenar el mismo atributo o mtodo ms veces de lo necesario. La idea clave es la de una clasificacin jerrquica en la que la clase hija o subclase hereda los atributos y mtodos de su clase padre. Por ejemplo, supongamos una clase persona, Clase persona Atributos Nombre Direccin Mtodos CambiarNombre( ) CambiarDireccin( ) ListasDatos( ) Podemos considerar las clases alumno y empleado en un nivel inferior. De este modo alumno y empleado heredarn los atributos y los mtodos de su clase padre persona a los que podemos aadir los atributos y mtodos propios de la clase hija. Lo anterior es, Clase alumno subclase de persona Atributos Estudios Curso Mtodos CambiarEstudios( ) CambiarCurso( ) ListarDatos( )
M. en C. Iliana Castillo Prez

Pgina 26

Fundamentos de C++

La declaracin anterior supone que la clase alumno herede los atributos y mtodos de la clase persona. Entonces un objeto de la clase alumno tendra los atributos Nombre, Direccin, Estudios y Curso y los mtodos CambiarNombre( ), CambiarDireccin( ), CambiarEstudios( ), CambiarCurso( ) y ListarDatos( ). As mismo sucede que hemos redefinido el mtodo ListarDatos( ) en la clase alumno para adaptarlo a las nuevas necesidades. Anlogamente podemos considerar las clases, administrativo y profesor, como subclases de la clase empleado. La jerarqua de clases resultante se muestra en la figura siguiente: Persona

Alumno

Empleado

Administrativo

Profesor

En una estructura jerrquica como la del ejemplo anterior, podemos establecer una relacin entre una clase y una subclase con los trminos padre e hijo, respectivamente. La clase padre se denomina tambin clase base y la clase hija clase derivada.

Caractersticas relevantes Abstraccin: El trmino abstraccin significa accin de separar mentalmente. Otra definicin podra ser: representacin de las caractersticas esenciales de algo, sin incluir antecedentes o detalles irrelevantes. Esto es, por medio de la abstraccin conseguimos no detenernos en los detalles concretos de las cosas que no interesan en ese comento sino generalizar y centrarse en los aspectos que permitan tener una visin global del tema. La abstraccin consiste en la generalizacin conceptual de los atributos y propiedades de un determinado conjunto de objetos. Precisamente la clave de la POO esta en abstraer los mtodos y los datos comunes a un conjunto de objetos y almacenarlos en una clase.

M. en C. Iliana Castillo Prez

Pgina 27

Fundamentos de C++

Una abstraccin que describa un conjunto de objetos en trminos de una estructura de datos y encapsula u oculta las operaciones sobre esa estructura se denomina tipo abstracto de datos. Encapsulamiento: El encapsulamiento u ocultamiento de informacin se refiere a la prctica de incluir dentro de un objeto todo lo que necesita, de tal forma que ningn otro objeto necesite conocer nuca su estructura interna. En C++, la abstraccin y el encapsulamiento estn representados por la clase. La clase es una abstraccin, porque de ella se definen las propiedades y los atributos genricos de un determinado conjunto de objetos con caractersticas comunes, y es una encapsulacin, porque constituye una caja negra que encierra tanto los datos de que constan los objetos como los mtodos que permiten manipularlos. Herencia: La herencia es el mecanismo para compartir automticamente mtodos y atributos entre clases y subclases. Las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en rboles o enrejados que reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple. En C++, herencia equivale a derivacin de clases; la clase padre recibe el nombre de clase base y la clase hija se denomina clase derivada. Esta caracterstica de la POO est fuertemente ligada a la reutilizacin del cdigo. Esto es, el cdigo de cualquiera de las clases existentes puede ser utilizado sin ms que crear una clase derivada de ella. Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
M. en C. Iliana Castillo Prez

Pgina 28

Fundamentos de C++

Concurrencia: La concurrencia le permite a los objetos operar simultneamente. Propiedad que distingue un objeto activo, en otras palabras permite que mltiples objetos acten al mismo tiempo. Persistencia: Los objetos en un programa requieren cierta cantidad de espacio en memoria. Los objetos tambin existen por un cierto periodo de tiempo, la persistencia es la propiedad por la cual la existencia de un objeto trasciende en el tiempo despus de que su creador deja de existir.

Ventajas Orientadas a Objetos Un lenguaje de programacin que soporte programacin orientada a objetos beneficia el desarrollo de software porque: Los objetos bien diseados son la base para sistemas que se construyen a partir de mdulos reutilizables, dando lugar a una mayor productividad La reutilizacin de las clases que han sido probadas en circunstancias reales, en proyectos anteriores, dan lugar a sistemas de mayor calidad y con menos errores La herencia hace posible definir sistemas mas fiables, mas fciles de ampliar y menos costosos de mantener Un diseo orientado a objetos es una herramienta clave para enfrentarse a problemas complejos porque favorece el paso de pequeos a grandes sistemas Las aplicaciones requieren escribir menos lneas de cdigo, menos sentencias de bifurcacin y por lo tanto los mdulos son ms comprensibles. La encapsulacin ayuda a construir sistemas mas seguros en contraste con la programacin tradicional, donde siempre existe la posibilidad de que una modificacin de un procedimiento o de una estructura de datos afecte a otros procedimientos, la programacin orientada a objetos no necesita examinar todo el cdigo fuente para ver si un cambio local afecta a otras partes.

M. en C. Iliana Castillo Prez

Pgina 29

Las Clases de Objetos

Unidad IV. Las clases de objetos


Las Clases de Objetos La POO encapsula datos (atributos) y funciones (comportamiento) en paquetes llamados clases. Los datos y las funciones de una clase se encuentran ntimamente ligadas entre si. A partir de una clase un programador puede crear un objeto. Una clase se puede reutilizar muchas veces para hacer muchos objetos de la misma clase. Las clases tienen la propiedad de ocultar informacin, esto significa que aunque los objetos de una clase pueden saber como comunicarse entre si a travs de interfaces bien definidas, por lo general a las clases no se les permite saber como se implementan otras clases, los detalles de implementacin estn ocultos dentro de las mismas clases. Las clases contienen datos as como un conjunto de funciones que manipulan esos datos. A los datos que componen una clase se les llama datos miembro. A las funciones que componen una clase se les llama funciones miembro (mtodos). Secciones de una clase Las clases de C++ proporcionan 3 niveles de visibilidad para los diversos miembros (datos miembro y funciones miembro): Seccin privada Seccin protegida Seccin publica En la seccin privada slo las funciones miembro de la clase pueden accesar los miembros privados, las clases descendientes tienen negado el acceso a los miembros privados de sus clases base. En la seccin protegida, slo las funciones miembro de la clase y de sus clases descendientes pueden accesar a los miembros. La seccin publica especifica miembros que son visibles a las funciones miembro de la clase, las instancias de la clase, las funciones miembro de las clases descendientes y casi a cualquiera que pueda estar interesado.
M. en C. Iliana Castillo Prez

Pgina 30

Las Clases de Objetos

Reglas de las secciones de la clase Las siguientes reglas se aplican a las diversas secciones de la clase: 1. Las secciones de la clase pueden aparecer en cualquier orden y ms de una vez. 2. Si no se especifica ninguna seccin de clase el compilador C++ trata a los miembros como privados. 3. Deber evitar declarar los datos miembro en la seccin pblica a menos que tal declaracin simplifique considerablemente su diseo. Los datos miembro son puestos por lo general en la seccin protegida para permitir que las funciones miembro de las clases descendientes tengan acceso a ellos. 4. Use funciones mimbro para asignar o consultar los valores de los datos miembro. Los mtodos que asignan los datos ayudan en la validacin y actualizacin de los datos miembro si es que se requiere. 5. La clase puede tener varios constructores. 6. La clase puede tener solamente un destructor el cual debe declararse en la seccin publica. 7. Las funciones miembro (as como los constructores y los destructores) que lleven varios enunciados se definen en el exterior de la declaracin de la clase. Ejemplo de una clase
class Punto { private: int x; int y; public: void asignarX(int valX); void asignarY(int valY); int obtenerX(); int obtenerY(); }; void Punto::asignarX(int valX) { x=valX; } void Punto::asignarY(int valY) { y=valY; } int Punto::obtenerX() { return x; } int Punto::obtenerY() { return y; }

Definicin de la clase

Cuerpo de la clase (Desarrollo de las funciones miembro)

M. en C. Iliana Castillo Prez

Pgina 31

Las Clases de Objetos

Existen algunas reglas para la creacin y uso de las clases: Las clases no se ejecutan (corren), slo se compilan. Las clases se guardan como un archivo de cabecera o librera para identificar que es cdigo que se puede reutilizar, por lo tanto se debern guardar con la extensin .h. Es conveniente tener el cuerpo de la clase en el mismo archivo que la declaracin para no generar demasiados archivos, que nos puedan confundir al momento de corregir errores. Programa que utiliza la clase Punto
#include <iostream.h> #include <conio.h> #include Punto.h //incluye el archivo que contiene nuestra clase Punto //la clase debe encontrarse en la misma carpeta que el programa void main() { int valx, valy; Punto p,q; //declara dos objetos de tipo Punto p.asignarX(13); //manda llamar a la funcin miembro asignarX() para el objeto p p.asignarY(8); //manda llamar a la funcin miembro asignarY() para el objeto p q.asignarX(9); //manda llamar a la funcin miembro asignarX() para el objeto q q.asignarY(16); //manda llamar a la funcin miembro asignarY() para el objeto q cout<< Las coordenadas de los puntos son: <<endl; cout<<P(<<p.obtenerX()<<,<<p.obtenerY()<<)<<endl; cout<<Q(<<q.obtenerX()<<,<<q.obtenerY()<<)<<endl<<endl; cout<<INGRESA NUEVAS COORDENADAS PARA EL PUNTO Q<<endl; // tambin se pueden reasignar valores solicitndolos al usuario cout<<coordenada x: ; cin>> valx; q.asignarX(valx); cout<<coordenada y: ; cin>> valy; q.asignarY(valy); cout<<endl<< Las coordenadas de los puntos ahora son: <<endl; cout<<P(<<p.obtenerX()<<,<<p.obtenerY()<<)<<endl; cout<<Q(<<q.obtenerX()<<,<<q.obtenerY()<<)<<endl; getch(); }

Como se puede apreciar, este programa debe guardarse en un archivo distinto al de la clase y deber tener la extensin .cpp. El hecho de guardar la clase y el programa en archivos separados determinan la reusabilidad de la clase.

M. en C. Iliana Castillo Prez

Pgina 32

Las Clases de Objetos

Otro ejemplo de clase:


#include <iostream.h> class CFecha { private: int dia,mes,anio; protected: int bisiesto(); public: void asignarFecha(); void obtenerFecha(); int fechaCorrecta(); }; void CFecha:: asignarFecha() { cout<<"DIA ##: ; cin>>dia; cout<<"MES ##: ; cin>>mes; cout<<"ANIO ####: "; cin>>anio; } int CFecha:: fechaCorrecta() { int diaCorrecto,mesCorrecto,anioCorrecto; //ao correcto anioCorrecto=(anio>=1900); //mes correcto mesCorrecto=(mes>=1 && mes<=12); //dia correcto switch(mes) { case 2: if(bisiesto()) diaCorrecto=(dia>=1 && dia<=29); else diaCorrecto=(dia>=1 && dia<=28); break; case 4: case 6: case 9: case 11: diaCorrecto=(dia>=1 && dia<=30); break; default: diaCorrecto=(dia>=1 && dia<=31); } // switch if(!(diaCorrecto && mesCorrecto && anioCorrecto)) { cout<<"\n DATOS NO VALIDOS \n ";
M. en C. Iliana Castillo Prez

Pgina 33

Las Clases de Objetos

return 0;//fecha incorrecta } else { return 1; //fecha correcta } // funcin

//verifica si el ao es bisiesto int CFecha:: bisiesto() { if((anio%4==0) && (anio%100==0) || (anio%400==0)) return 1; //bisiesto else return 0; //no bisiesto } void CFecha::obtenerFecha() { cout<<dia<<"/"<<mes<<"/"<<anio<<endl; }

La clase se ha guardado en un archivo con el nombre CFecha.h en la misma carpeta donde se guardar el programa que la utilice, dicho programa es el siguiente:
#include <iostream.h> #include <conio.h> #include "CFecha.h" void main() { CFecha fecha1; do { fecha1.asignarFecha(); }while(! fecha1.fechaCorrecta()); fecha1.obtenerFecha(); getch(); }

//declaracin de un objeto llamado fecha1 del tipo de la clase

En este sencillo programa se declara un objeto llamado fecha1 del tipo de la clase CFecha, posteriormente se inicia un ciclo en el cual se ejecutar el mtodo asignarFecha() sobre el objeto fecha1, la condicin del ciclo determina que ste se repetir hasta que el usuario ingrese una fecha correcta, una vez que se haya ingresado una fecha vlida, sale del ciclo y ejecuta el mtodo obtenerFecha() sobre el objeto fecha1, mostrando en pantalla la fecha correcta que se haya introducido. Ejercicio 1: Realizar una clase para crear objetos de tiempo validando lo siguiente: Horas >=0 y <=23
M. en C. Iliana Castillo Prez

Pgina 34

Las Clases de Objetos

Minutos >=0 y <=59 Segundos >=0 y <=59 Debe incluir funciones miembro para asignar el tiempo, as como validarlo y mostrarlo. Agregar las funciones necesarias para mostrar la hora en formato de 12 y de 24 horas. Ejemplo de una clase con variables alfanumricas
#include <iostream.h> #include <string.h> class Persona { private: char nombre[30]; int edad; char curp[20]; char sexo; public: void asignarNombre(char nom[30]); void asignarEdad(int ed); void asignarCurp(char cr[20]); void asignarSexo (char se); const char* obtenerNombre(); int obtenerEdad(); const char* obtenerCurp(); char obtenerSexo(); void listarDatos(); }; void Persona::asignarNombre(char nom[30]) { strcpy(nombre,nom); } void Persona::asignarEdad(int ed) { edad=ed; } void Persona::asignarCurp(char cr[20]) { strcpy(curp,cr); } void Persona::asignarSexo(char se) { sexo=se; } const char* Persona::obtenerNombre() { return nombre; }
M. en C. Iliana Castillo Prez

Pgina 35

Las Clases de Objetos

int Persona::obtenerEdad() { return edad; } const char* Persona::obtenerCurp() { return curp; } char Persona::obtenerSexo() { return sexo; } void Persona::listarDatos() { cout<<"NOMBRE: "<<nombre<<endl; cout<<"EDAD: "<<edad<<endl; cout<<"CURP: "<<curp<<endl; cout<<"SEXO: "<<sexo<<endl; }

// Programa que utiliza la clase Persona


#include #include #include #include <iostream.h> <conio.h> <stdio.h> "Persona.h"

void main() { char nom[30], c[20], s; int e; Persona persona1; //declaracin del objeto persona1 cout<<"\n USO DE LA CLASE PERSONA "<<endl; cout<<"\n\n INGRESA EL NOMBRE: "; gets(nom); cout<<"\n INGRESA LA EDAD "; cin>>e; cout<<"\n INGRESA LA CURP "; gets(c); cout<<"\n INGRESA EL SEXO "; cin>>s; persona1.asignarNombre(nom); persona1.asignarEdad(e); persona1.asignarCurp(c); persona1.asignarSexo(s); cout<<endl<<endl; cout<<persona1.obtenerNombre()<< ES DE SEXO <<persona1.obtenerSexo()<<, TIENE <<persona1.obtenerEdad()<< AOS Y SU CURP ES <<persona1.obtenerCurp()<<endl; cout<<\n\n LISTANDO DATOS<<endl; persona1.listarDatos(); getch(); }
M. en C. Iliana Castillo Prez

Pgina 36

Las Clases de Objetos

Constructores En C++ una forma de asegurar que los objetos siempre contengan valores vlidos es escribir un constructor. Un constructor es una funcin miembro especial de una clase que es llamada automticamente siempre que se declara un objeto de esa clase. Su funcin es crear e inicializar un objeto de su clase. Un constructor se distingue fcilmente por que tiene el mismo nombre que la clase a la que pertenece. Por ejemplo, el constructor para la clase CFecha se denomina tambin CFecha. Cuando una clase tiene un constructor, ste ser invocado automticamente siempre que se cree un nuevo objeto de esa clase. Un constructor no se hereda, no puede retornar un valor (incluyendo void) y no puede ser declarado const ni static. Se puede crear un objeto de cualquiera de las formas siguientes: 1) 2) 3) 4) Declarando un objeto global Declarando un objeto local u objeto temporal Invocando al operador new Llamando explcitamente a un constructor

Existen 5 tipos de constructores: 1) 2) 3) 4) 5) Constructor por omisin (implcito) Constructor explcito con argumentos Constructor explcito con argumentos por omisin Constructor copia Constructor explcito

Constructor por omisin Dado que los constructores son funciones miembro, admiten argumentos igual que stas. Cuando en una clase no especificamos ningn constructor el compilador crea uno por omisin sin argumentos.

M. en C. Iliana Castillo Prez

Pgina 37

Las Clases de Objetos

Un constructor por omisin de una clase determinada es un constructor que se puede invocar sin argumentos. Si el objeto creado es global, el constructor por omisin inicializa a ceros los datos miembro numricos y a nulos los datos miembro alfanumricos. Si el objeto creado es local, lo inicializa con valores indeterminados (basura). Constructor explcito con argumentos Un constructor explcito con argumentos es aquel que define una lista de argumentos que le ayudarn a inicializar el objeto con valores vlidos, en dicha lista de argumentos recibe los valores con los cuales inicializar el objeto que se va a construir. Ejemplo:
#include <iostream.h> class CFecha { private: int dia, mes, anio; protected: int Bisiesto(); public: CFecha(int, int, int); void asignarFecha(); void obtenerFecha(); int fechaCorrecta(); };

//constructor explcito con argumentos

CFecha::CFecha(int dd, int mm, int aa) { dia = dd; mes = mm; anio = aa; } // // Aqu continua la construccin del resto de las funciones miembro de la clase. //

Una vez declarado el constructor explcito con argumentos en la clase, la declaracin de los objetos en el programa sera de la siguiente forma:
#include <iostream.h> #include <conio.h> #include CFecha.h //Nombre del archivo de la clase CFecha void main() { CFecha fecha1(13,9,2009); //ejecuta el constructor explcito con argumentos CFecha fecha2(23,10,2009);
M. en C. Iliana Castillo Prez

Pgina 38

Las Clases de Objetos

fecha1.obtenerFecha(); fecha2.obtenerFecha(); getch(); }

Una vez que se ha declarado un constructor, como en el caso del constructor explcito con argumentos, ste substituye al constructor por omisin que genera el compilador y ya no podemos declarar objetos sin enviar argumentos como en el caso: CFecha fecha3; Esta lnea generara un error ya que el nuevo constructor requiere tres argumentos enteros. Para solucionar este problema, debemos agregar a la clase el constructor por omisin tal como se muestra a continuacin:
#include <iostream.h> class CFecha { private: int dia, mes, anio; protected: int Bisiesto(); public: CFecha(){}; // constructor por omisin CFecha(int, int, int); //constructor explcito con argumentos void asignarFecha(); void obtenerFecha(); int fechaCorrecta(); }; CFecha::CFecha(int dd, int mm, int aa) { dia = dd; mes = mm; anio = aa; } // // Aqu continua la construccin del resto de las funciones miembro de la clase. //

Una vez declarado en la clase el constructor por omisin, ser posible generar objetos en el programa, ya sea enviando los tres argumentos o sin enviar argumentos, tal como se muestra en el siguiente cdigo:
#include <iostream.h> #include <conio.h> #include CFecha.h void main( ) { CFecha fecha1(13,9,2009); //Objeto que utiliza el constructor explcito con argumentos
M. en C. Iliana Castillo Prez

Pgina 39

Las Clases de Objetos

CFecha fecha2(23,10,2009); CFecha fecha3; // objeto que llama automticamente al constructor por omisin CFecha fecha4; fecha1.obtenerFecha(); fecha2.obtenerFecha(); getch(); }

Para el caso del constructor explcito con argumentos, C++ recomienda utilizar siempre que sea posible la siguiente sintaxis:
CFecha::CFecha(int dd, int mm, int aa): dia(dd), mes(mm), anio(aa) { }

Los dos puntos a continuacin de la lista de parmetros del constructor CFecha indica que sigue una lista de inicializadores, en este caso, los datos miembro de la clase. Observe tambin que el cuerpo del constructor aparece vaco puesto que no se requiere ninguna operacin adicional.

Constructor explcito con argumentos por omisin Una forma de reducir el nmero de constructores, es utilizar constructores con argumentos por omisin, este tipo de constructor declara una lista de argumentos a continuacin del nombre del constructor y adems los inicializa con algn valor predefinido, permitiendo hacer llamadas al constructor sin argumentos o incluso con uno, dos, tres o n argumentos segn sea el caso. Ejemplo:
#include <iostream.h> class CFecha { private: int dia, mes, anio; protected: int Bisiesto(); public: CFecha(int dd=1, int mm=1, int aa=1900); //constructor explcito con // argumentos por omisin void asignarFecha(); void obtenerFecha(); int fechaCorrecta(); }; CFecha::CFecha(int dd, int mm, int aa) { dia = dd; mes = mm; anio = aa; }
M. en C. Iliana Castillo Prez

Pgina 40

Las Clases de Objetos

// // Aqu continua la construccin del resto de las funciones miembro de la clase. //

Como se puede observar, el cuerpo del constructor es el mismo que en el caso del constructor explcito con argumentos, la nica diferencia radica en la declaracin del constructor, que es donde se inicializan los parmetros. Ahora, al momento de declarar y construir los objetos en el programa, podremos hacerlo envindole diferente nmero de argumentos, ejemplo:
#include <iostream.h> #include <conio.h> #include CFecha.h //Nombre del archivo de la clase CFecha void main() { CFecha fecha; CFecha fecha1(13); //ejecuta el constructor explcito con argumentos por omisin CFecha fecha2(13,2); CFecha fecha3(13,2,2010); fecha.obtenerFecha(); fecha1.obtenerFecha(); fecha2.obtenerFecha(); fecha3.obtenerFecha(); getch(); }

Constructor Copia Otra forma de inicializar un objeto es asignndole otro objeto de la misma clase en el momento de su declaracin, esto es, cuando se crea. Por ejemplo: CFecha hoy(18,2,2010); CFecha otroDia(hoy); CFecha unDia=hoy; En este ejemplo, se crea y se inicializa el objeto hoy y a continuacin se crean los objetos otroDia y unDia inicializndolos con el objeto hoy. Un constructor que crea un nuevo objeto a partir de otro existente es denominado constructor copia. Un constructor de stas caractersticas tiene un solo argumento, el cual es una referencia a un objeto constante de la misma clase. Si no especificamos un constructor copia, el compilador proporciona un constructor copia por omisin pblico, para cada clase definida. Tambin cuando sea necesario podemos codificar nuestra propia versin del constructor copia. Ejemplo: el constructor copia de la clase CFecha sera:
M. en C. Iliana Castillo Prez

Pgina 41

Las Clases de Objetos

#include <iostream.h> class CFecha { private: int dia, mes, anio; protected: int Bisiesto(); public: CFecha(const CFecha &ObFecha); void asignarFecha(); void obtenerFecha(); int fechaCorrecta(); };

//constructor copia

CFecha::CFecha(const CFecha &obFecha) { dia = obFecha.dia; mes = obFecha.mes; anio = obFecha.anio; } // // Aqu continua la construccin del resto de las funciones miembro de la clase. //

Vemos que el constructor copia acepta como argumento una referencia al objeto a copiar y que el cuerpo del constructor copia, asigna miembro a miembro ese objeto en el nuevo objeto construido, motivo por el cual se llama constructor copia.

Constructor explcito El constructor explcito, denominado tambin constructor de inicializacin a ceros, permite generar objetos limpios, libres de cualquier basura que el compilador pudiera darles al momento de realizar la asignacin de memoria. Este tipo de constructor es uno de los ms utilizados y permite, al igual que el compilador por omisin en el caso de los objetos globales, inicializar con ceros las variables numricas y a nulos las variables alfanumricas, aunque tambin podramos utilizarlo para que inicializara nuestros objetos con algn valor predefinido, sin embargo esta no es su principal aplicacin. Ejemplo:
#include <iostream> #include <conio.h> #include <string.h> class CVentas { private:
M. en C. Iliana Castillo Prez

Pgina 42

Las Clases de Objetos

char codigoEmp[10]; char nombre[30]; double ventas[12]; public: CVentas(); //constructor explcito void asignarCodigo(char cod[10]); void asignarNombre(char nom[30]); void asignarVentaMensual(double v, int const char* obtenerCodigo( ); const char* obtenerNombre(); double obtenerVentaMes(int mes); double obtenerVentasAnuales( ); };

mes);

CVentas::CVentas() { strcpy(codigoEmp,""); // inicializa la variable codigoEmp con una cadena vaca (nulo) strcpy(nombre,""); // inicializa la variable nombre con una cadena vaca (nulo) for(int i=0;i<12;i++) { ventas[i]=0.0; //inicializa cada una de las posiciones del arreglo ventas con 0.0 } } void CVentas::asignarCodigo(char { strcpy(codigoEmp,cod); } void CVentas::asignarNombre(char { strcpy(nombre,nom); } cod[10]) nom[30])

void CVentas::asignarVentaMes(double v, int mes) { ventas[mes]=v; } const char* CVentas::ObtenerCodigo( ) { return codigoEmp; } const char* CVentas::ObtenerNombre( ) { return nombre; } double CVentas::obtenerVentasMes(int { return ventas[m]; } m)

double CVentas::obtenerVentasAnuales( ) { double vAnuales=0.0; for(int i=0;i<12;i++) { vAnuales+=ventas[i]; } return vAnuales; } //Fin de la clase y del archivo CVentas.h

M. en C. Iliana Castillo Prez

Pgina 43

Las Clases de Objetos

Programa que utiliza la clase CVentas:


#include #include #include #include <iostream.h> <conio.h> <stdio.h> "CVentas.h"

void main() { char codigo[10]; char nombre[30]; double ventaMensual; CVentas emp1; cout<<"\n INGRESA EL CODIGO DEL EMPLEADO: "; gets(codigo); emp1.asignarCodigo(codigo); cout<<"\n INGRESA EL NOMBRE DEL EMPLEADO: "; gets(nombre); emp1.asignarNombre(nombre); for(int i=0;i<12;i++) { cout<<"\n INGRESA LA VENTA DEL MES "<<(i+1)<<" : "; cin>>ventaMensual; emp1.asignarVentaMes(ventaMensual,i); } cout<<endl<<endl; cout<<"\n LAS VENTAS DEL EMPLEADO "<<emp1.obtenerNombre() <<" CON CODIGO " <<emp1.obtenerCodigo()<<" SON: "<<endl<<endl; cout<<" MES VENTA<<endl; cout<<________________________<<endl; for(int i=0;i<12;i++) { cout<<" "<<(i+1)<< <<emp1.obtenerVentaMes(i)<< endl; } cout<<"\n LAS VENTAS ANUALES SON: " <<emp1.obtenerVentasAnuales()<<endl; getch(); }

Destruccin de objetos De la misma forma que existe una funcin para construir cada uno de los objetos que declaramos, tambin existe una funcin que permite destruir cada objeto construido, liberando as la memoria que ocupa. Esta funcin recibe el nombre de destructor. Un objeto es destruido al salir del mbito en el que ha sido definido el objeto. Sin embargo, hay una excepcin: los objetos creados dinmicamente por el operador new tienen que ser destruidos utilizando el operador delete, de lo contrario el sistema destruir la variable puntero pero no liberar el espacio de memoria referenciado por ella. A diferencia de lo que ocurre con los constructores, slo es posible definir un destructor por clase.
M. en C. Iliana Castillo Prez

Pgina 44

Las Clases de Objetos

Destructor Un destructor es una funcin miembro especial de una clase que se utiliza para eliminar un objeto de esa clase, liberando la memoria que ocupa. Un destructor se distingue fcilmente porque tiene el mismo nombre que la clase a la que pertenece precedido por una tilde ~. Un destructor no se hereda, no tiene argumentos, no puede retornar un valor (incluyendo void) y no puede ser declarado const ni static. Cuando en una clase no especificamos un destructor, el compilador crea uno por omisin (default) pblico. Por ejemplo, el destructor para la clase CFecha es declarado como: ~CFecha( ); EJEMPLO:
#include <iostream.h> #include <conio.h> class CFecha { private: int dia,mes,anio; protected: int bisiesto(); public: CFecha (const CFecha &obfecha); //constructor copia CFecha (int d=1, int m=1, int a=1900); //explicito con argumentos por omisin ~ CFecha(); //destructor void asignarFecha(); void obtenerFecha(); int fechaCorrecta(); }; CFecha::CFecha(const CFecha &obfecha) { dia = obfecha.dia; mes = obfecha.mes; anio = obfecha.anio; }

//constructor copia

CFecha::CFecha(int d, int m, int a) //explicito con argumentos por omisin { dia = d; mes = m; anio = a; }
M. en C. Iliana Castillo Prez

Pgina 45

Las Clases de Objetos

CFecha:: ~CFecha() //destructor { cout<<"\n Objeto Destruido"; getch(); } void CFecha::asignarFecha() { cout<<"\n DIA ## "; cin>>dia; cout<<"\n MES ## "; cin>>mes; cout<<"\n ANIO #### "; cin>>anio; } int CFecha::fechaCorrecta() { int diaCorrecto,mesCorrecto,anioCorrecto; //ao correcto anioCorrecto =(anio>=1900); //mes correcto mesCorrecto =(mes>=1)&&(mes<=12); //dia correcto switch(mes) { case 2: if(bisiesto()) diaCorrecto =(dia>=1 && dia<=29); else diaCorrecto =(dia>=1 && dia<=28); break; case 4: case 6: case 9: case 11: diaCorrecto =(dia>=1 && dia<=30); break; default: diaCorrecto =(dia>=1 && dia<=31); } if(!(diaCorrecto && mesCcorrecto && anioCorrecto)) { cout<<"\n DATOS NO VALIDOS \n "; return 0; //fecha incorrecta } else return 1; //fecha correcta } //verifica si el ao es bisiesto int CFecha:: bisiesto() { if((anio%4==0)&&(anio%100==0)||(anio%400==0)) return 1; //bisiesto else return 0; //no bisiesto }
M. en C. Iliana Castillo Prez

Pgina 46

Las Clases de Objetos

void CFecha::obtenerFecha() { cout<<" La fecha es : "<<dia<<"/"<<mes<<"/"<<anio<<endl; }

El cuerpo de un destructor se ejecuta antes que los destructores de los objetos miembro. Cuando se destruya el objeto CFecha, se visualizar el mensaje Objeto destruido y a continuacin el sistema invocar al destructor int::~int(), una vez por cada uno de los miembros dia, mes y anio. Un destructor tambin se puede llamar explcitamente utilizando su nombre completo: Objeto.nombre_clase::~nombre_clase(); pObjeto -> nombre_clase::~nombre_clase();

Ejercicios de clases con arreglos: Ejercicio 1 1. Escribe una clase que permita construir objetos en los cuales almacenar las estaturas de un grupo de alumnos y el ao en que fue tomada la estatura, as como las funciones miembro o los mtodos que permitan manipular dichos atributos. Incluye un constructor explcito, un constructor copia y un destructor. 2. Escribe un programa donde se implemente el uso de la clase antes creada, genera dos objetos utilizando cada uno de los constructores de la clase y permite que el estado de uno de ellos sea alterado por el usuario ingresando datos desde teclado y mostrndole posteriormente, los datos que ingres. Ejercicio 2: 1. Escribe una clase que permita construir objetos en los cuales almacenar las calificaciones de 15 alumnos, el nombre de la materia, el nombre del profesor que imparte la materia, el semestre y el grupo. Agrega las funciones miembro o los mtodos que permitan manipular dichos atributos. Incluye un constructor explcito, un constructor copia y un destructor. 2. Escribe un programa donde se implemente el uso de la clase antes creada, genera dos objetos utilizando cada uno de los constructores de la clase y permite que el estado de uno de ellos sea alterado por el usuario ingresando datos desde teclado y mostrndole posteriormente, los datos que ingres.

M. en C. Iliana Castillo Prez

Pgina 47

Las Clases de Objetos

Puntero this Cada objeto de una determinada clase mantiene su propia copia de los datos miembro de la clase, pero no de las funciones miembro, de las cuales slo existe una copia para todos los objetos de esa clase. Esto es, cada objeto tiene su propia estructura de datos, pero todos comparten el mismo cdigo, el correspondiente a la interface, por lo tanto, para que una funcin miembro conozca la identidad del objeto particular para el cual dicha funcin ha sido invocada, C++ proporciona un puntero al objeto denominado this. As por ejemplo, si declaramos un objeto fecha1 y a continuacin le enviamos el mensaje asignarFecha(); fecha1.asignarFecha(); C++ define un puntero this para permitir referirse al objeto fecha1 en el cuerpo de la funcin que se ejecuta como respuesta al mensaje. La definicin es as: CFecha * const this = &fecha1; Y cuando realizamos la misma operacin con otro objeto fecha2: fecha2.asignarFecha(); C++ define el puntero this para apuntar al objeto fecha2 de la siguiente forma: CFecha * const this = &fecha2; Segn lo expuesto la funcin asignarFecha puede ser definida tambin como se muestra a continuacin:
void CFecha::asignarFecha() { //this hace referencia al objeto para el que haya sido invocada la funcin. cout<<DIA ##: ; cin>>this -> dia; cout<<MES ##: ; cin>>this -> mes; cout<<ANIO ####: ; cin<<this->anio; }

Operador new Para llevar a cabo la asignacin dinmica de la memoria libre, C++ dispone de los operadores new y delete.
M. en C. Iliana Castillo Prez

Pgina 48

Las Clases de Objetos

La sintaxis para utilizar el operador new es: puntero = new tipo_del_objeto; puntero = new (tipo_del_objeto); El operador new permite asignar memoria para un objeto o para un arreglo de objetos. El operador new asigna memoria desde el rea de memoria de almacenamiento libre (free store). En el caso de un objeto, el tamao viene definido por su tipo. En el caso de arreglos, hay que especificar explcitamente el tamao. El operador new devuelve un puntero a un objeto del tipo especificado, que referencia el espacio reservado, ejemplo: CFecha *potroDia = new CFecha(hoy); Cuando el tipo especificado corresponde a un arreglo, el operador new devuelve un puntero al primer elemento de dicho arreglo, ejemplo: int *a = new int [ n_elementos ]; a
0 1 2 3 4

C++ tambin permite inicializar un objeto al momento de crearlo; en este caso la sintaxis de new sera: puntero = new tipo_del_objeto(inicializadores); Cuando se inicializa un objeto de esta forma, lo que sucede es que se invoca automticamente al constructor del tipo de objeto. Ejemplo: double *pd = new doubl(3.25); El ejemplo anterior inicializa el objeto de tipo double con el valor 3.25. Ejemplo con asignacin dinmica de memoria:
#include <iostream.h> #include <string.h> class Empleado { private: char *nombre;
M. en C. Iliana Castillo Prez

Pgina 49

Las Clases de Objetos

char *apellido; //dato miembro esttico static int cuenta;

//numero de instancias de los objetos

public: Empleado(const char*,const char*); //constructor ~Empleado(); //desctructor const char* obtenerNombre(); //devuelve nombre const char* obtenerApellido(); //devuelve apellido //funcin miembro esttica static int obtenerCuenta(); //devuelve el nmero de instancias de los objetos }; //fin de la declaracin de la clase empleado //define e inicializa el dato miembro esttico int Empleado::cuenta=0; //define la funcin miembro esttica que devuelve el nmero de instancias de la clase empleado int Empleado::obtenerCuenta() { return cuenta; } Empleado::Empleado(const char* primero,const char* ultimo) { nombre=new char[strlen(primero)+1]; strcpy(nombre,primero); apellido= new char[strlen(ultimo)+1]; strcpy(apellido,ultimo); cuenta++; cout<<"\n Constructor Empleado para "<<nombre<<" "<<apellido <<" Llamado."<<endl; } Empleado::~Empleado() { cout<<" \n~Empleado() llamado para "<<nombre<<" "<<apellido<<endl; delete[] nombre; delete[] apellido; cuenta--; } const char* Empleado::obtenerNombre() { return nombre; } const char* Empleado::obtenerApellido() { return apellido; }

//Programa que utiliza la clase Empleado.h


#include <iostream.h> #include <conio.h> #include "Empleado.h" void main() {
M. en C. Iliana Castillo Prez

Pgina 50

Las Clases de Objetos

cout<<"\n El Numero de Empleados antes de la creacion de instancias es: <<Empleado::obtenerCuenta()<<endl; Empleado Empleado " *pEm1 = new Empleado("Susana" , "Baez"); *pEm2 = new Empleado("Alejandro" , "Murataya");

cout<<"\n El Numero de Empleados despues de la creacion de instancias es <<pEm1->obtenerCuenta(); cout<<"\n\n Empleado 1: "<<pEm1->obtenerNombre()<<" " <<pEm1->obtenerApellido(); cout<<"\n\n Empleado 2: "<<pEm2->obtenerNombre()<<" " <<pEm2->obtenerApellido(); cout<<"\n\n"; delete pEm1; pEm1=0; cout<<"\n El Numero de empleados despues de la eliminacion es " <<Empleado::obtenerCuenta()<<endl; delete pEm2; pEm2=0; cout<<"\n El Numero de empleados despues de la eliminacion es " <<Empleado::obtenerCuenta()<<endl; getch();

Funciones miembro y datos miembro estticos La palabra reservada static declara miembros (atributos o mtodos) que estn asociados a una clase en vez de a una instancia de la clase. Datos miembro estticos A veces resulta til tener una variable compartida por todas las instancias de una clase. Esta variable podra utilizarse, por ejemplo, como base para la comunicacin entre instancias o para llevar el control del nmero de instancias que se han creado. El modo compartido se consigue marcando la variable con la palabra static. Este tipo de variables a veces se denominan variables de clase para distinguirlas de los miembros o las variables de instancia, que no se comparten. Los datos miembro estticos de la clase: Pueden colocarse en la seccin pblica o privada de la clase. Deben crearse e inicializarse antes de llamar a la funcin main(). Los comparten todas las instancias de la clase (objetos). Slo existe una copia de los datos miembro.
Pgina 51

M. en C. Iliana Castillo Prez

Las Clases de Objetos

Las funciones no miembro no pueden acceder a ellos, a menos que las funciones aparezcan en la seccin pblica de la declaracin de la clase. Son independientes de las instancias de la clase (objetos). Deben inicializarse fuera de la declaracin de la clase.

Hay dos formas de acceder a un dato miembro esttico. La primera es utilizar el nombre de la clase, seguido por un operador de determinacin de mbito y por el nombre del dato miembro esttico. Ejemplo: Nombre_clase::dato_miembro_estatico La segunda forma es utilizar el nombre de cualquier objeto de la clase, seguido por el operador punto y por el nombre del dato miembro esttico. Ejemplo: Nombre_del_objeto.dato_miembro_estatico Para declarar un dato miembro esttico en la declaracin de la clase, hay que poner la palabra reservada static delante del nombre y del tipo de dato del dato miembro esttico. Tambin, debe definirse el dato miembro esttico y proporcionarle un valor inicial enseguida del trmino de la declaracin de la clase.

Funciones miembro estticas Las funciones miembro de la clase tambin pueden ser estticas, Las funciones miembro son prcticas cuando se necesita acceder a los datos relacionados con toda la clase. Se puede llamar a las funciones miembro estticas utilizando el nombre de la clase o el nombre de cualquier objeto de esa clase. Ejemplo: Nombre_de_la_clase::metodo_estatico(argumentos); Nombre_del_objeto.metodo_estatico(argumentos); Igual que los datos miembro estticos, las funciones miembro estticas son independientes de la instancia, lo que significa que no tienen un objeto para llamarlas y no tienen acceso al apuntador this. Las funciones miembro estticas slo pueden acceder y manipular datos miembro estticos. Ejemplo:
#include <string.h> #include <iostream.h> class Video { private: char nombre[30]; char productor[30];
M. en C. Iliana Castillo Prez

Pgina 52

Las Clases de Objetos

short cantidad; static int total; //Se incrementa cada vez que se alquila un video. public: Video(char[30],char[30],short); Video(const Video &v_in); ~Video(); const char* obtenerNombre(); const char* obtenerProductor(); short obtenerCantidad(); void rentar(); static int obtenerTotal(); }; int Video::total=0; Video::Video(char n[30],char p[30],short c) { strcpy(nombre,n); strcpy(productor,p); cantidad = c; } Video::Video(const Video &v_in) { strcpy(nombre,v_in.nombre); strcpy(productor,v_in.productor); cantidad = v_in.cantidad; } Video::~Video() { cout<<"Objeto destruido..."; } const char* Video::obtenerNombre() { return nombre; } const char* Video::obtenerProductor() { return productor; } short Video::obtenerCantidad() { return cantidad; } void Video::rentar() { total++; } int Video::obtenerTotal() { return total; }

// programa que utiliza la clase Video con miembros estticos


#include <iostream.h> #include <conio.h> #include "VideoEstaticos.h" void main() { Video peli1("El padrino","Cameron Co.", 34); Video peli2("As Good As It Gets", "Jacks inc.", 22);
M. en C. Iliana Castillo Prez

Pgina 53

Las Clases de Objetos

peli1.rentar(); cout<<Video::obtenerTotal()<<" video(s) alquilado(s)."<<endl; cout<<"La pelicula: " <<peli1.obtenerNombre()<<" de: " <<peli1.obtenerProductor()<<" fue alquilada."<<endl<<endl; peli2.rentar(); cout<<Video::obtenerTotal()<<" video(s) alquilado(s)."<<endl; cout<<"La pelicula: " <<peli2.obtenerNombre()<<" de: " <<peli2.obtenerProductor()<<" fue alquilada."<<endl<<endl; getch(); }

Funciones en lnea Una funcin en lnea (inline) es una funcin cuyo cdigo sustituye a la llamada a la funcin en el programa ya que el cdigo generado para la funcin, cuando se compila, se inserta en el punto donde se invoca a la funcin en lugar de hacerlo en otro lugar y hacer una llamada. Esto nos proporciona una ventaja, el cdigo de estas funciones se ejecuta ms rpidamente ya que se evita usar la pila para pasar parmetros y se evitan las instrucciones de salto y retorno. Tambin tiene un inconveniente, se generar el cdigo de la funcin tantas veces como sta se use, con lo que el tamao del programa aumenta considerablemente. Es por estos dos motivos por los que slo se usan funciones inline cuando las funciones son pequeas (pocas lneas de cdigo). Existen dos formas de declarar una funcin como inline: 1) Las funciones que se definen dentro de la declaracin de las clases son inline implcitamente (por default). Por ejemplo:
class Punto { private: int x, y; public: void asignarX(int vx) { x = vx; }; void asignarY(int vy) { y = vy }; };

2) La otra forma de declarar funciones inline es hacerlo explcitamente, usando la palabra reservada inline. Ejemplo:
class Punto { private: int x, y; public: void asignarX(int vx); void asignarY(int vy);
M. en C. Iliana Castillo Prez

Pgina 54

Las Clases de Objetos

}; inline void asignarX(int vx) { x = vx; } inline void asignarY(int vy) { y = vy; }

Tambin es posible generar funciones inline en un mbito fuera de las clases, es decir en programas normales. Ejemplo:
#include <iostream.h> #include <conio.h> inline void funcion() //se agrega la palabra inline { cout << "Hola" << endl; } void main() { funcion(); funcion(); funcion(); getch(); }

Al compilar el programa, el compilador colocar en cada llamada a funcin, las lneas de cdigo que contiene la funcin, y el programa anterior se transformara en algo como esto:
void main() { cout << "Hola" << endl; cout << "Hola" << endl; cout << "Hola" << endl; getch(); }

Sobrecarga de funciones Es una caracterstica de C++ que permite declarar varias funciones que tienen el mismo nombre, pero diferente lista de parmetros. La potencia real de las funciones sobrecargadas se encuentra en la capacidad para definir diversas versiones de la misma rutina, capaces de actuar con diferentes tipos de datos. Ejemplo:
M. en C. Iliana Castillo Prez

Pgina 55

Las Clases de Objetos

//Sobrecarga de la funcion Cubo


#include <iostream> #include <conio.h> int cubo (int); //prototipo de funcion sobrecargada double cubo(double); //prototipo de funcion sobrecargada void main() { int ix = 5; double dx = 1.5; cout<<"El cubo de "<< ix <<" es "<<cubo(ix)<<endl; //el compilador al ver un valor int elige la funcin cout<<"El cubo de "<< dx <<" es "<<cubo(dx)<<endl; //la llamada es igual con un valor double getch(); } int cubo (int y ) //Funcion sobrecargada para valores int { return y*y*y; } double cubo (double y) //Funcion sobrecargada para valores double { return y*y*y; }

Sobrecarga de mtodos C++ permite sobrecargar tanto las funciones miembro definidas para una clase como las funciones que no forman parte de una clase. En programacin, puede haber varios mtodos en una clase que tengan el mismo nombre pero diferente lista de argumentos (diferentes firmas de mtodos). Este concepto se denomina sobrecarga de mtodos. Cuando se escribe el cdigo para llamar a uno de estos mtodos, se elige el mtodo adecuado en funcin del tipo de argumento o del nmero de argumentos que se suministran. Se aplican dos reglas a los mtodos sobrecargados: 1) Las listas de argumentos deben ser diferentes. Las listas de argumentos de la sentencia de llamada deben diferir lo suficiente como para poder determinar sin ambigedad cul es el mtodo al que se debe llamar.

M. en C. Iliana Castillo Prez

Pgina 56

Las Clases de Objetos

2) Los tipos de retorno pueden ser diferentes. El tipo de retorno de los mtodos puede ser diferente, pero no es suficiente si sta es la nica diferencia. Las listas de argumentos de los mtodos sobrecargados deben ser distintas. Ejercicio1: Realizar un programa que utilice la sobrecarga de funciones, para sumar 2 y 3 nmeros enteros y 2 y 3 nmeros doubles, el programa principal debe solicitar 3 nmeros enteros y 3 nmeros doubles y hacer las llamadas a funcin respectivas. La salida debe mostrar la suma de 2 nmeros enteros, la suma de los 3 nmeros enteros, la suma de 2 nmeros doubles y la suma de los 3 nmeros doubles. Ejercicio 2: Generar la clase Camisa de acuerdo al siguiente diagrama UML Camisa - idCamisa: int - descripcin : char[30] - idColor : char - precio : float - stock : int + Camisa( ); + asignarInfo(int, char[30], float) : void + asignarInfo(int, char[30], float, char) : void + asignarInfo(int, char[30], float, char, int) : void + mostrarDatos( ) : void El orden para la asignacin de los parmetros es: idCamisa, descripcin, precio, idColor y stock. Una vez generada la clase, crear el programa correspondiente, incluir la clase en el programa, instanciar 4 objetos de la clase Camisa y asignar valores a los ltimos 3 objetos utilizando las 3 diferentes funciones sobrecargadas. Finalmente, mostrar los datos de todos los objetos generados utilizando la funcin para tal fin. Compilar y correr el programa, observar lo que sucede y anotar las conclusiones.

Funciones Amigas Las funciones amigas actan como conexin entre funciones que no son miembro de ninguna clase y clases con las que no tengan ninguna relacin. Algunas funciones que no forman parte de la clase, necesitan acceder a los datos miembro privados de la clase. Estas funciones no tienen acceso a los datos miembro privados porque no son miembros de la clase.
M. en C. Iliana Castillo Prez

Pgina 57

Las Clases de Objetos

Para proporcionar amistad a funciones no miembro debe incluirse en la declaracin de la clase la declaracin de la funcin amiga. Como las funciones amigas no son miembro de la clase, no es necesario poner sus declaraciones en la seccin pblica, aunque por lo general se colocan en esa seccin. La palabra clave friend distingue estas funciones de las funciones miembro que pertenecen a la clase. Si se declaran funciones amigas (friend) en ms de una clase, la funcin tiene acceso a los datos miembro privados de todas las clases en las que la funcin se ha declarado como amiga. Las funciones no pueden declararse ellas mismas como amigas de una clase, slo la clase puede dar la amistad a una funcin. Escribir el cdigo en C++ del cuerpo de una funcin amiga, es igual que escribir el de otras funciones, excepto en que a la funcin amiga hay que pasarle un objeto de clase. Ejemplo: //clase video guardada en el archivo Video.h
#include <string.h> #include <iostream.h> #include <conio.h> #ifndef VIDEO_H #define VIDEO_H class Video { private: char *titulo; char *productor; int existencia; public: Video(char *="", char *="", int=0); //constructor explcito con arg. por omisin Video(const Video &videoIn); //constructor copia ~Video(); const char* obtenerTitulo(); const char* obtenerProductor(); int obtenerExistencia(); friend void imprimir(Video &v); }; Video::Video(char *t, char *p, int e) //constructor explcito con arg. por omisin { Titulo = new char[strlen(t)+1]; strcpy(titulo,t); productor = new char[strlen(p)+1]; strcpy(productor,p); existencia=e;
M. en C. Iliana Castillo Prez

Pgina 58

Las Clases de Objetos

} Video::Video(const Video &videoIn) //constructor copia { Titulo = new char[strlen(videoIn.titulo)+1]; strcpy(titulo,videoIn.titulo); productor = new char[strlen(videoIn.productor)+1]; strcpy(productor,videoIn.productor); existencia=videoIn.existencia; } Video::~Video() { delete[] titulo; delete[] productor; cout<<"\n Objeto Destruido \n"; getch(); } const char* Video::obtenerTitulo() { return titulo; } const char* Video::obtenerProductor() { return productor; } int video::obtenerExistencia() { return existencia; } #endif

// Archivo amiga.cpp que contiene a la funcin amiga de Video


#include <iostream.h> #include <conio.h> #include "Video.h" void imprimir(Video &v) { //funcion amiga que tiene acceso a los datos miembro privados cout<<"\n TITULO "<<v.titulo<<endl; cout<<"\n PRODUCTOR "<<v.productor<<endl; cout<<"\n EXISTENCIA "<<v.existencia<<endl; }

//Archivo .cpp que contiene el programa principal


#include #include #include #include <iostream.h> <conio.h> "Video.h" "amiga.cpp"

void main() {
M. en C. Iliana Castillo Prez

Pgina 59

Las Clases de Objetos

Video item1("Titanic","Cameron Co",40); Video item2("Transformers","Smith",30); cout<<"\n LLAMADA NORMAL A FUNCIONES DE LA CLASE \n"; cout<<"Titulo "<<item1.obtenerTitulo()<<endl; cout<<"Productor "<<item1.obtenerProductor()<<endl; cout<<"Existencia "<<item1.obtenerExistencia()<<endl<<endl; cout<<"Titulo "<<item2.obtenerTitulo()<<endl; cout<<"Productor "<<item2.obtenerProductor()<<endl; cout<<"Existencia "<<item2.obtenerExistencia()<<endl<<endl; cout<<"LLAMADA A FUNCION AMIGA \n"; imprimir(item1); imprimir(item2); }

M. en C. Iliana Castillo Prez

Pgina 60

Sobrecarga de Operadores

Unidad V. Sobrecarga de operadores


Operadores unitarios (unarios) Un operador unario es un operador que tiene un nico operando. El operador ++, por ejemplo, es unario. Algunos operadores tales como + son unitarios y binarios, dependiendo de su uso. El principio de la sobrecarga de operadores tiene gran aplicacin en operadores unitarios. Los operadores unitarios son: Operador new delete ++ -() [] + * & ! ~ , Operadores binarios Los operadores binarios toman dos argumentos, uno a cada lado del operador. Los operadores binarios pueden ser sobrecargados tan fcilmente como los operadores unitarios. Se pueden sobrecargar pasando a la funcin dos argumentos si no es funcin miembro. El primer argumento es el operando izquierdo del operador sobrecargado y el segundo argumento es el operando derecho, si la funcin no es miembro de la clase. Operadores binarios que se pueden sobrecargar: Operador + * / % =
M. en C. Iliana Castillo Prez

Significado

incremento Decremento Llamada a funcin Indexacin Ms Menos Desreferencia (indireccin) Direccin de NOT lgico NOT bit a bit coma

Significado Adicin (suma) Resta Multiplicacin Divisin Mdulo Asignacin


Pgina 61

Sobrecarga de Operadores

+= -= *= /= %= & | ^ ^= %= |= == != > < >= <= || && << <<= >> >>= -> ->*

Suma con asignacin Resta con asignacin Multiplicacin con asignacin Divisin son asignacin Mdulo con asignacin AND bit a bit OR bit a bit OR exclusivo bit a bit OR exclusivo bit a bit con asignacin AND bit a bit con asignacin OR bit a bit con asignacin Igual No igual Mayor que Menor que Mayor o igual que Menor o igual que OR lgico AND lgico Desplazamiento a izquierda Desplazamiento a izquierda con asignacin Desplazamiento a derecha Desplazamiento a derecha con asignacin Puntero Puntero a miembro

Sobrecarga de Operadores El trmino operador sobrecargado se refiere a un operador que es capaz de desarrollar su funcin en varios contextos diferentes sin necesidad de otras operaciones adicionales. C++ provee la facilidad de asociar una funcin a un operador estndar con el fin de que la funcin sea llamada cuando el compilador detecte este operador en un contexto especfico. Esta facilidad es conocida como operador sobrecargado. C++ permite sobrecargar operadores como parte de una definicin de clase. Si se sobrecarga un operador para una clase, ste se utilizar con los objetos de ese tipo de clase.

M. en C. Iliana Castillo Prez

Pgina 62

Sobrecarga de Operadores

Utilizar un operador con los objetos de una clase que no tenga sobrecargado el operador producir un error porque el compilador intentar utilizar el operador y no sabr cmo utilizarlo. Los operadores sobrecargados no pueden tener argumentos por defecto. Un operador sobrecargado debe ser o bien una funcin miembro no esttica o una funcin no miembro que tenga al menos un parmetro cuyo tipo es una clase, o una referencia. Esta regla evita cambiar el significado de operadores que operan sobre tipos de datos bsicos. La sintaxis para declarar un operador sobrecargado es la siguiente: tipo operatoroperador (lista de parmetros); Donde: tipo operador

Indica el tipo del valor retornado por la funcin. Es un operador unario o binario permitido.

Los siguientes operadores no se pueden sobrecargar: Operador . .* :: ?: Significado Acceso a miembro Indireccin de acceso a miembro Resolucin de mbitos Operador condicional

Los operadores sobrecargados tienen siempre el nombre, operatorop, donde op indica el operador de C++. Por ejemplo, la funcin operator==( ) es un operador sobrecargado que sobrecarga el operador de igualdad (==). El operador sobrecargado debe utilizar el mismo nmero de operandos que el operador de C++ y no se puede cambiar la precedencia o la asociatividad del operador. Tampoco se pueden crear nuevos operadores o cambiar el significado de los operadores de C++. En un programa de C++ se llama al operador sobrecargado cuando se utiliza el smbolo del operador con operandos que son objetos. El cdigo siguiente muestra la utilizacin del operador == sobrecargado con los objetos Video como operandos. if(video1 == video2) Cuando C++ encuentra el operador == sobrecargado, los dos objetos se utilizan de la forma siguiente: el objeto situado a la izquierda del operador es el objeto llamado y el objeto situado a la derecha del operador es el que se pasa a la funcin operator==( ) como un argumento. Por tanto, la sentencia del ejemplo de cdigo previo es equivalente a la sentencia de C++ siguiente: video1.operator==(video2);
M. en C. Iliana Castillo Prez

Pgina 63

Sobrecarga de Operadores

Ejemplo 1:
#include <iostream.h> #include <string.h> class Video { private: char titulo[30]; char productor[30]; int existencias; public: void asignarInformacion(char[30], char[30], int); bool operator==(Video &objV); void mostrarDatos( ); }; void Video::asignarInformacion(char t[30], char p[30], int e) { strcpy(titulo,t); strcpy(productor,p); existencias = e; } bool Video::operator==(Video &objV) { if ((strcmp(titulo, objV.titulo)) && (strcmp(productor, objV.productor) ) && existencias == objV.existencias) { return true; //son iguales } else { return false; //son diferentes } } void Video::mostrarDatos( ) { cout<<TITULO: <<titulo<<endl <<PRODUCTOR: <<productor<<endl <<EXISTENCIAS: <<existencias<<endl; }

M. en C. Iliana Castillo Prez

Pgina 64

Sobrecarga de Operadores

Ejemplo 2:
class Racional { private: int numerador; int denominador; public: Racional (int=0,int=1); Racional operator+(const Racional &r); int obtenerNumerador(); int obtenerDenominador(); }; Racional::Racional(int num,int den):numerador(num),denominador(den) { if(den==0) denominador=1; if(den<0) { numerador=-numerador; denominador=-denominador; } } Racional Racional::operator+(const Racional &r) { numerador=numerador*r.denominador+denominador*r.numerador; denominador=denominador*r.denominador; return *this; } int Racional::obtenerNumerador() { return numerador; } int Racional::obtenerDenominador() { return denominador; }

//Archivo Racional.cpp que contiene el programa principal


#include<iostream.h> #include<conio.h> #include "Racional.h" void main() { Racional A(1,2),B(1,3),C; cout<<"El valor del numerador racional A es: " <<A.obtenerNumerador()<<"/"<<A.obtenerDenominador()<<endl; cout<<"El valor del numerador racional B es: " <<B.obtenerNumerador()<<"/"<<B.obtenerDenominador()<<endl; C=A+B; cout<<"\n la suma de los numeros racionales anteriores es: " <<C.obtenerNumerador()<<"/"<<C.obtenerDenominador()<<endl; getch();}
M. en C. Iliana Castillo Prez

Pgina 65

Sobrecarga de Operadores

Prctica: 1) Utilice la funcin de Tiempo generada anteriormente. 2) Agregue a la clase la sobrecarga de los operadores + y de acuerdo a lo siguiente: T1: 12 : 34 : 58 T1: 16 : 04 : 58 + 210 (min.) T2 : 12 : 34 : 58 T2: 16 : 04 : 58 210 min. 3) Genere un programa en el que se implemente la clase construyendo 3 objetos de tipo Tiempo para probar la sobrecarga de los operadores. 4) Solicite al usuario que ingrese los valores para el 1er. objeto de tipo Tiempo. 5) Solicite al usuario los minutos que va a sumar al objeto y ejecute la operacin utilizando el operador +. 6) Muestre en pantalla el resultado de la operacin. 7) Solicite al usuario que ingrese valores para los 2 objetos restantes. 8) Ejecute la resta de los objetos utilizando el operador -. 9) Muestre en pantalla el resultado en minutos de la operacin realizada. 10) Escriba las conclusiones de la prctica.

M. en C. Iliana Castillo Prez

Pgina 66

Relaciones entre clases

Unidad VI. Relaciones entre clases


Herencia Simple La herencia en C++ es un mecanismo de abstraccin creado para poder facilitar y mejorar el diseo de las clases de un programa. Con ella se pueden crear nuevas clases a partir de clases ya hechas, siempre y cuando tengan un tipo de relacin especial. Cuando se crea una clase, en lugar de escribir datos y funciones miembro completamente nuevos, el programador puede decidir que dicha clase nueva puede heredar los miembros de una clase existente. Esta clase existente se llama clase base, y a la nueva clase se le llama clase derivada. Una clase derivada representa un grupo de objetos ms especializado. En la herencia, las clases derivadas "heredan" los datos y las funciones miembro de las clases base, pudiendo las clases derivadas redefinir estos comportamientos (polimorfismo) y aadir comportamientos nuevos propios de la clase derivada. Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected se comportar como pblica en la clase Base y en las que componen la jerarqua de herencia, y como privada en las clases que NO sean de la jerarqua de la herencia. Ejemplos de herencia: Clase Base Estudiante

Clase Derivada EstudianteGraduado EstudianteNoGraduado Circulo Triangulo Rectangulo PrestamoAutomovil PrestamoMejoraCasa PrestamoHipotecario Docente Administrativo CuentaDeCheques CuentaDeAhorros

Forma

Prestamo

Empleado

Cuenta

M. en C. Iliana Castillo Prez

Pgina 67

Relaciones entre clases

Los miembros de la clase base que no deben ser accesibles a las funciones miembro de las clases derivadas deben declararse como privadas en la clase base. Una clase derivada puede afectar los cambios de estado en los miembros privados de la clase base, pero solamente a travs de funciones miembro no privadas proporcionadas en la clase base y heredadas a la clase derivada. Sintaxis general de la herencia en C++:
class <nombre_clase_derivada>: [<acceso>] <nombre_clase_heredada> { // Cuerpo de la declaracin de la clase };

El nombre_clase_heredada se refiere a una clase base declarada previamente. sta pude estar ya compilada, o puede que se declare en el mismo programa que la derivada, en este segundo caso se debe declarar la clase base antes de la derivada, o al menos declarar el nombre de la clase base como una referencia anticipada. Tipos de acceso El acceso puede ser private, protected o public. Si se omite se supone que el acceso es private, de forma que si se quiere dar un acceso public o protected se debe hacer explcitamente. Los elementos private de la clase base son inaccesibles para la clase derivada, sea cual sea el acceso. Si el acceso es public, todos los elementos public y protected de la clase base seguirn siendo public y protected respectivamente en la clase derivada. Si el acceso es private, entonces todos los elementos public y protected de la clase base pasarn a ser elementos private de la clase derivada. Si el acceso es protected todos los miembros public y protected de la clase base se convierten en elementos protected de la clase derivada. En la siguiente tabla se resumen los especificadores de acceso: Acceso Descripcin Los miembros pblicos de la clase base son miembros pblicos de la clase derivada. Los miembros protegidos de la clase base son miembros protegidos de la clase derivada. Los miembros privados de la clase base no son accesibles para la clase derivada.
Pgina 68

public

M. en C. Iliana Castillo Prez

Relaciones entre clases

Los miembros pblicos de la clase base son miembros privados de la clase derivada. Los miembros protegidos de la clase base con miembros privados de la private clase derivada. Los miembros privados de la clase base no son accesibles para la clase derivada. Los miembros pblicos de la clase base son miembros protegidos de la clase derivada. Los miembros protegidos de la clase base son miembros protegidos de protected la clase derivada. Los miembros privados de la clase base no son accesibles para la clase derivada. La herencia hace analoga a la expresin es un de tal forma que si la frase <claseB> ES-UN <claseA> tiene sentido, entonces estamos ante un posible caso de herencia donde clase A ser la clase base y clase B la derivada. Ejemplo: clases Barco: Acorazado, Carguero, etc. Un Acorazado ES-UN Barco Un Carguero ES-UN Barco Un Trasatlntico ES-UN Barco, etc. La definicin de la clase base y las clases derivadas sera la siguiente:
class Barco { protected: char* nombre; float peso; public: //Constructores y dems funciones bsicas de barco };

y ahora las caractersticas de las clases derivadas, podran (a la vez que heredan las de barco) aadir atributos propios del subtipo de barco que se crea, por ejemplo:
class Carguero: public Barco { private: float carga; //El resto de los atributos }; class Acorazado: public Barco { private: int numeroArmas; int Soldados;
M. en C. Iliana Castillo Prez

// Esta es la manera de especificar que hereda de Barco

Pgina 69

Relaciones entre clases

//El resto de los atributos };

Se puede aadir a la clase derivada datos y funciones miembro. Dentro de las funciones miembro de la clase derivada se puede llamar a las funciones miembro y manejar los datos miembro que estn en la seccin pblica y protegida de la clase base. En una clase derivada se heredan todos los datos miembro de la clase base excepto los estticos. Algunas funciones miembro no se heredan de forma automtica. stas son los constructores, el destructor, las funciones amigas, las funciones estticas de la clase, y el operador de asignacin sobrecargado.

Ejemplo de clases derivadas: //Clase Punto.h


#include <iostream.h> #include <conio.h> class Punto { protected: int x; int y; public: Punto(int vx,int vy); //explicito con argumentos void asignarX(int xval); void asignarY(int yval); int obtenerX(); int obtenerY(); void imprimir(); }; Punto::Punto(int vx,int vy) //explicito con argumentos { x=vx; y=vy; } void Punto::asignarX(int xval) { x=xval; } void Punto::asignarY(int yval) { y=yval; } int Punto::obtenerX() { return x;
M. en C. Iliana Castillo Prez

Pgina 70

Relaciones entre clases

} int Punto::obtenerY() { return y; } void Punto::imprimir() { cout<<(<<x<<,<<y<<)<<endl; }

//Clase derivada Circulo.h


#include <iostream.h> #include "Punto.h" class Circulo : public Punto { private: double radio; public: Circulo(int=0, int=0, double=0.0); void asignarRadio(double); double obtenerRadio(); double obtenerDiametro(); double obtenerCircunferencia(); double obtenerArea(); void imprimir(); }; Circulo::Circulo(int vx, int vy, double vr) { x=vx; y=vy; asignarRadio(vr); } void Circulo::asignarRadio(double val) { radio=(val<0.0?0.0:val); } double Circulo::obtenerRadio() { return radio; } double Circulo::obtenerDiametro() { return (radio*2); } double Circulo::obtenerCircunferencia() { return(3.14159*obtenerDiametro()); } double Circulo::obtenerArea() { return (3.14159*radio*radio); }
M. en C. Iliana Castillo Prez

Pgina 71

Relaciones entre clases

void Circulo::imprimir() //Sobrescritura del mtodo imprimir( ) { cout<<"\n CENTRO ("<<x<<","<<y<<") \n RADIO: "<<radio<<endl; }

//Programa principal que utiliza la clase derivada


#include <iostream.h> #include <conio.h> #include "Circulo.h" void main() { Circulo circ1(37,43,2.5); cout<<"\n LA COORDENADA EN X ES: "<<circ1.obtenerX() <<"\n LA COORDENADA EN Y ES: "<<circ1.obtenerY() <<"\n EL RADIO ES: "<<circ1.obtenerRadio()<<endl; circ1.asignarX(2); circ1.asignarY(6); circ1.asignarRadio(4.25); cout<<"\n\n LA NUEVA UBICACION ES: "<<endl; circ1.imprimir(); cout<<"\nEL DIAMETRO ES: "<<circ1.obtenerDiametro()<<endl; cout<<"\nLA CIRCUNFERENCIA ES: "<<circ1.obtenerCircunferencia()<<endl; cout<<"\nEL AREA ES: "<<circ1.obtenerArea()<<endl; getch(); }

Ejercicios: 1) Generar la clase derivada de Punto para representar un cuadriltero, los atributos a conocer sern las aristas ya que el punto ser el centro de dicho cuadriltero. Agregue las funciones miembro respectivas para poder calcular el permetro y el rea del cuadriltero. Adems, agregue una funcin que determine si el cuadriltero es un cuadrado o un rectngulo. Escriba el cdigo del programa principal a fin de probar la clase antes creada.

2)

Ficha

Libro

Revista

De la jerarqua anterior, generar el cdigo de la clase base y las clases derivadas segn lo siguiente:
M. en C. Iliana Castillo Prez

Pgina 72

Relaciones entre clases

Referencia Ficha Titulo Autor Editorial Nmero de pginas Ao Revista Numero

Libro

Composicin Reutilizar cdigo existente es una de las ventajas principales de la POO. Se pueden utilizar varias tcnicas para reutilizar las clases de C++. Una de esas tcnicas es llamada composicin e implica aadir un objeto de una clase existente dentro de una clase nueva. Ahora la clase nueva tiene un miembro o miembros que son de otro tipo de clase. Ejemplo 1: //Clase que contiene un elemento de otra clase
#include <iostream.h> #include <string.h> class Persona //Clase compuesta { private: char nombre[30]; char curp[20]; char sexo[10]; CFecha fechaNac; //Declaracin de un objeto dentro de una nueva clase public: void asignarNombre(char nom[30]); void asignarCurp(char cr[20]); void asignarSexo (char se[10]); void asignarFechaNacimiento(); const char* obtenerNombre(); const char* obtenerCurp(); const char* obtenerSexo(); void obtenerFechaNacimiento(); void listarDatos(); }; void Persona::asignarNombre(char nom[30]) { strcpy(nombre,nom); }
M. en C. Iliana Castillo Prez

Pgina 73

Relaciones entre clases

void Persona::asignarCurp(char cr[20]) { strcpy(curp,cr); } void Persona::asignarSexo(char se[10]) { strcpy(sexo,se); } void Persona::asignarFechaNacimiento() { do { fechaNac.asignarFecha(); }while(!fechaNac.fechaCorrecta()); } const char* Persona::obtenerNombre() { return nombre: } const char* Persona::obtenerCurp() { return curp; } const char* Persona::obtenerSexo() { return sexo: } void Persona::obtenerFechaNacimiento() { fechaNac.obtenerFecha(); } void Persona::listarDatos() { cout<<"NOMBRE: cout<<"CURP: cout<<"SEXO: cout<<"FECHA DE NACIMIENTO: cout<<endl; }

"<<nombre<<endl; "<<curp<<endl; "<<sexo<<endl; ";obtenerFechaNacimiento();

//Programa que emplea la clase Persona que tiene un objeto de tipo CFecha
#include #include #include #include <iostream.h> <conio.h> <stdio.h> "Persona.h"

void main() { Persona person; char nom[30],c[20],sex; cout<<" --------INGRESANDO DATOS DE UNA PERSONA ------"<<endl; cout<<"\n Ingresa el nombre: ";
M. en C. Iliana Castillo Prez

Pgina 74

Relaciones entre clases

gets(nom); person.setNombre(nom); cout<<" Ingresa la CURP: "; gets(c); person.setCurp(c); cout<<" Ingresa el sexo (F/M): "; cin>>sex; person.setSexo(sex); cout<<" Ingresa la fecha de nacimiento: "<<endl; person.setFechaNacimiento(); cout<<endl<<endl; cout<<" ------- MOSTRANDO DATOS --------- "<<endl; cout<<"NOMBRE: "<<person.getNombre()<<endl; cout<<"CURP: "<<person.getCurp()<<endl; cout<<"SEXO: "<<person.getSexo()<<endl; cout<<"FECHA DE NACIMIENTO: "; person.getFechaNacimiento(); getch(); }

Nota: La nica modificacin que se tendra que hacer en la clase CFecha, sera la de agregarle un constructor explcito para que inicie el objeto declarado en la clase Persona con valores vlidos y limpio de basura.

Ejemplo 2: //Clase que contiene un arreglo de objetos de otra clase


#include "video.h" const int MAX=10; class Inventario //clase compuesta { private: Video misVideos[MAX]; //arreglo de objetos de tipo Video int numVideos; public: Inventario(); Inventario& operator=(const Inventario &ob); int obtenerNumeroVideos(); void asignarInfo(char [30],char [30],short); void imprimirInfo(); }; Inventario::Inventario() { for(int i=0; i<MAX; i++) { misVideos[i].asignarTitulo(""); misVideos[i].asignarProductor(""); misVideos[i].asignarExistencias(0);
M. en C. Iliana Castillo Prez

Pgina 75

Relaciones entre clases

} numVideos=0; } Inventario& Inventario::operator=(const Inventario &ob) { for(int i=0; i<numVideos; i++) { misVideos[i] = ob.misVideos[i]; } numVideos = ob.numVideos; return *this; } int Inventario::obtenerNumeroVideos() { return numVideos; } void Inventario::asignarInfo(char t[30], char p[30], short e) { misVideos[numVideos].asignarTitulo(t); misVideos[numVideos].asignarProductor(p); misVideos[numVideos].asignarExistencias(e); numVideos++; } void Inventario::imprimirInfo() { for(int i=0; i<numVideos; i++) { cout<<"TITULO: "<<misVideos[i].obtenerTitulo()<<endl <<"PRODUCTOR: "<<misVideos[i].obtenerProductor()<<endl <<"Existencias: "<<misVideos[i].obtenerExistencias() <<endl<<endl; } }

//Programa que utiliza la clase Inventario


#include #include #include #include <iostream.h> <conio.h> <stdio.h> "Inventario.h"

void main() { char tit[30], prod[30]; short ex; Inventario inv; cout<<"---INGRESANDO DATOS DE VIDEOS---"<<endl; for(int i=0; i<2; i++)
M. en C. Iliana Castillo Prez

Pgina 76

Relaciones entre clases

{ cout<<"\nIngresa titulo: "; gets(tit); cout<<"Ingresa productor: "; gets(prod); cout<<"Ingresa existencias: "; cin>>ex; inv.asignarInfo(tit,prod,ex); } cout<<endl<<"Se han ingresado "<<inv.obtenerNumeroVideos() <<" videos."<<endl; cout<<"\n------ VIDEOS INGRESADOS ------"<<endl; inv.imprimirInfo(); getch(); }

Ejercicio: Elaborar una clase, utilizando composicin, en la que se guarden datos referentes a un evento, los campos que debe contemplar son: nombre del evento, lista de asistentes al evento, fecha del evento y lugar donde se llevar a cabo el evento.

M. en C. Iliana Castillo Prez

Pgina 77

Manejo de Archivos

Unidad VII. Manejo de Archivos


Archivos de Texto Un archivo es un conjunto de datos que se guardan bajo un nombre comn, por lo general en la memoria del disco o en algn dispositivo de almacenamiento. Un archivo es fsicamente almacenado en un medio externo y utiliza un nombre nico de archivo que se conoce como nombre externo del archivo. El nombre externo del archivo es el nombre que reconoce el sistema operativo. Archivos de entrada y salida La clase fstream se puede utilizar para leer o para escribir datos en un archivo. Se deriva de la clase iostream que desciende de la clase ios. Los programas de C++ pueden leer las entradas desde un archivo y escribir las salidas en un archivo. Para utilizar archivos de entrada/salida (I/O) en los programas de C++ se debe: 1) Escribir la sentencia #include <fstream.h> al principio del programa. 2) Declarar una variable de tipo stream de archivo, por ejemplo: ifstream fin; Donde ifstream es el tipo de clase de los archivos de entrada ofstream fout; Donde ofstream es el tipo de clase de los archivos de salida 3) Abrir los archivos de entrada y/o salida utilizando la funcin miembro open() y especificando el nombre del archivo que se quiere abrir, por ejemplo: fin.open (infile.txt); fout.open (outfile.txt); 4) Leer los datos almacenados en el archivo de entrada o bien escribir los datos en el archivo de salida. 5) Cerrar los archivos de entrada y/o salida utilizando la funcin miembro close(), por ejemplo: fin.close(); fout.close(); Cuando se abre un archivo se puede utilizar un segundo argumento para indicar el modo de apertura. Las posibles formas son: Funcin miembro Ios::app Ios::ate Ios::nocreate Ios::noreplace Significado Adjunta al archivo. Posiciona el apuntador del archivo al final de ste. El archivo debe existir o se producir un error. El archivo no debe existir o se producir un error.

Despus de declarar y abrir un stream para el archivo de salida pueden escribirse datos en ese archivo utilizando el operador de insercin (<<).
M. en C. Iliana Castillo Prez

Pgina 78

Manejo de Archivos

Para leer los datos desde un archivo se utiliza el operador de extraccin (>>); adems se pueden utilizar las funciones put(), flush() para archivos de salida y get(), getline(), putback(), ignore(), peek() y clear() para archivos de entrada.

Ejemplo con archivos de texto:


#include #include #include #include <iostream.h> <fstream.h> <stdlib.h> <conio.h>

void main() { ifstream fin; //stream de archivo de entrada ofstream fout; //stream de archivo de salida char caracter; //Abre el archivo de entrada fin.open(prueba_in.txt); if( !fin ) //apertura fallida { cerr<<Error al abrir el archivo para lectura; getch(); exit(1); } fout.open(prueba_out.txt); if( !fout ) { cerr<<Error al abrir el archivo para escritura; getch(); exit(1); } // Lee un caracter. Devuelve verdadero hasta que lee EOF While( fin>>caracter ) { Fout<<cadena<<endl; //escribe un carcter seguido de una nueva lnea } Fin.close( ); Fout.close( ); Cout<<Proceso terminado; Getch(); }

M. en C. Iliana Castillo Prez

Pgina 79

Das könnte Ihnen auch gefallen