100% encontró este documento útil (1 voto)
533 vistas48 páginas

Programacion Orientada A Objetos Con C++

programación orientada a objetos con c++

Cargado por

rodrigo_cid
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
100% encontró este documento útil (1 voto)
533 vistas48 páginas

Programacion Orientada A Objetos Con C++

programación orientada a objetos con c++

Cargado por

rodrigo_cid
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF o lee en línea desde Scribd
ORIENTADA A OBJETOS TIPOS DE DATOS Y OPERADORES aaa UE ST YAM SUL TER DIAGRAMAS DE CLASES Y DE OBJETOS HERENCIA Y POLIMORFISMO ESTRUCTURAS DE DATOS DINAMICAS Y PLANTILLAS TRO NLS eNO eee PENCE Messer co USERS TITULO: CH AUTOR: Diego Ruiz COLECCION: — Manuales USERS FORMATO: 24x17 em PAGINAS: 352 Copyright © MMV, Es una publicacién de Fox Andina en coedicion con DALAGA S.A, Hecho el depdsito que marca la ley 11723, Todos los derechos reservados. Esta publicacidn no puede ser reproducida ni en todo ni en parte, por ningcn medio actual 0 futuro sin el permiso preva y por escrito de Fox Andina S.A. Su infraccién esta penada por las leyes 11723 y 25446. La editorial no asume responsablidad alguna por cualquier consecuencia derivada de la fabricacién, funcionamiento y/o utiizacion de los servicios y productos que se describen y/o analizan, Todas las marcas mencionadas en este litro son propiedad exclusiva de sus respectivos duefios. Impreso en Argentina. Libro de edicicn argentina. Primera impresion realzada en Sevagraf, Costa Rica 5226, Grand Bourg, Malvinas Argentinas, Pcia. de Buenos Aires en Vil, MMXIV ISBN 978-987-1949-64-9 Ruiz, Diego C++ / Diego Ruiz ; coordinado por Gustavo Carballo. - 1a ed. - Ciudad Autonoma de Buenos ‘res: Fox Andina; Buenos Alres: Dalaga, 2014. 352 p. | 24 x 17 om. - (Manual users; 268) ISBN 978-987-1949-64-9 1. Informatica |. Carballeiro, Gustavo, coord. I Titulo DD 005.3 LRUSERS PRELIMINARES: El libro de un vistazo En este libro abarcaremos los principales temas que componen la pro- gramacién orientada a objetos con C++: cudles son sus caracteristicas y c6mo se utilizan sus funciones. El contenido de cada capitulo es eminente- mente te6rico, acompafiado siempre de diagramas y consejos practicos. “uv ¥@ vee PROGRAMACION ORIENTADA A OBJETOS eae En este primer capitulo abordaremos los conceptos principales que hacen a la programacién orientada a objetos y haremos una introduccidn a los sistemas complejos. *o “ve FUNDAMENTOS DE C++ Estudiaremos los elementos que componen este lenguaje de programacién y conoceremos sus principales virtudes. *O “vu ee TTT ‘Aprenderemos a interactuar con el usuario, veremos qué es un array y cémo empleario, y comenzaremos a trabajar con variables que contengan texto, Ademas, explicaremos cémo crear nuestras propias funciones. Zi wer ASE Y OBJETO En este capitulo profundizaremos aspectos del lenguaje estudiando, bésicamente, una de sus estructuras principales: la clase. >> [Link] Descubriremos cémo solicitar memoria desde un programa en forma dinamica or medio de los punteros, para hacer un uso més eficiente de los recursos de la computadora. Veremos también qué son las referencias. * vee En este capitulo abordaremos herencia y composicién, dos recursos fundamentales en el momento de crear el madelo de datos de nuestro sistema. Veremos cémo trabajan los constructores y destructores y crearemos una pila y una cola utilizando un array. ¥n “iv Bae Estudiaremos el polimorfismo, tercer gran pilar de la programacién orientada @ objetos. Tambien veremos mecanismos que implementa el lenguaje para dar soporte a esta caracteristica: la sobrecarga de funciones y operadores, los métodos virtuales y las clases abstractas. CH Geass 5 *ng vee ‘esta formado por una serie de diagramas: -que nos ayudardn a disefiar y documentar los Veremos cémo trabajar con los recursos que diferentes componentes de! sistema. ofrece C++ para la manipulacién de archivos: escritura y lectura de datos binatios, y cuales ‘son los pasos a seguir para almacenar el estado de un objeto en y desde un archivo. Cates ES ao yet ec) STi * no vee Aprenderemos a implementar una lista fate] 7 cenlazada, una lista doblemente enlazada, Las una pila dindmica y una cola dinamica. Los patrones de disefio son soluciones Finalmente, aprenderemos a reimplementar documentadas a problemas clésicos todas estas estructuras, pero de modo surgidos en la construccién de sistemas independiente del tipo de dato que manejen, orientados a objetos. En este capitulo, por medio de las plantas. veremos algunos de los patrones mas populares que podremos aplicar. ayoys LLL a ibreria STL es un poderoso aliado ala TSA CDE ELSES hora de codificar sistemas que requieran Este sistema de notaciones esta destinado estructuras de datos, como arrays, listas, al modelado de aplicaciones que se pilas, colas y mapas. En este capitulo basan, principalmente, en conceptos de la veremos cémo hacer uso de ella y, asi, programacion orientada a objetos. Este sistema mejorar nuestra productividad. i Pee Ree Ves Le ‘Alo lergo de este manual podré encontrar una serie de recuadros que le brindarén informacisn complementaria: ‘curiosidades, trucos, ideas y consejos sobre los temas tratados. Para que pueda distinguirlos en forma mas sencila, cada recuado esta identiicado con diferentes iconos: ‘CURIOSIDADES. ATENCION DATOS UTILES sITios WEB, EIDEAS ‘YNOVEDADES [Link] <« USERS! Contenido El libro de un vistazo. Informacién complementaria.. Introduccion. Programacion orientada a objetos Introduccion Programacién no estructurada 6 Programacion procedural. lS Programacién modular... 16 Programacion orientada a objets. 6 Qué es un objeto? 7 ‘Mas caracteristicas de los objetos ....... 1D ‘Adin mas caracteristicas de los objetos. 20 El andlisis y el disefo en la programacion orientada a objeto: El lenguaje unificado de modelado.. Resumen Actividades ava >> [Link] PRELIMINARES Fundamentos de C++ {Qué es un lenguaje de pragramacién’. Proceso de compilaci6n sin. Proceso de enlace. Entornes de programacién Un poco de historia. Diferencias entre C y C++ Nuestro primer programa en C++. Comentarios. [sentencta | Constantes.. Tipos de datos fundamentales.. Nameros entero Nameros no enters... El operador sizeo.. Caracteres. ns El tipo de dato void Booleans. Operadores.. Precedencia de operadores. CH Control del flujo de ejecucién. Sentencias condicionales. ‘Sentencia de bucle 62 Resumen. Actividades... Aspectos avanzados del lenguaje Entratia y salida en C44. El objeto cout n Elobjeto cin. El preprocesador array Funciones.. Funciones que retornan ValOr€S snc Funciones con parametros... Aguitectura de un programa complejo. Los string en C++, Funciones para la manipulacion Uso de una estructura qa. Enumeradore: Enumeradores sin valor numérico asociado. Fijando un valor iicial Resumen... Actividades inAuto2 Clase y objeto Laclase.. Las funciones miembros 0 métodos... El diagrama de clases El diagrama de objetos. El constructor... El destructor noms ‘Modificadores de acceso.. Propiedades estitica: ‘Matodos estaticos Restricciones de os métodos estaticos. El juego de ta vida. La resolucion.. 158 La propiedad 158 Los métodos 159 La funcion main, 168 Patrones de interés 170 Resumen Actividades. Class Foo ( We mse nda prvadas public: i. ‘fide aoa protected: U).. iad ores proteins private: Hae Ove mite y rains prnas public: hss foves rmétodotypropladades pions } [Link] <« 8 CESS Gestion de memoria Los punteros. 174 Como declarar una variable tipo punter. ATS El operador new. wl TB Operatior delete 178 179 Punteros a array. Cadenas de texto Aritmética de punteros.. Las referencias aa Los punteros como parametros de funciones.. ae Los punteros como valor de veto. 198 Variables estticas 201 Puntero a objetos.... Las propiedades Uttlizar la clase Cadena... El constructor de copia. Array de objetos... El puntero this. Resumen Actividades fa pkeawe a “eh 250; eh L: tie p >> [Link] PRELIMINARES Herencia Métodos constantes.. Crear subelases.. Madificadores de acceso en la herencia El modificador de acceso protected... Invocacién de construtore... NNRERS Invocacion de destructores 5. Extraigo un elemento, dienentoqueingess | |] (51 ‘enlapila, 6 |) > 3 B] mWtinottnento Le [ 5] [21 4 [1] 9 |t0) Constructores con paraémetros.. Composicién.. Ocultar el nombre de un método.. Compasicién vs. Herencia Herencia mattiple El caso del diamante... Caso de estudio. Cémo funciona una pila Cémo funciona una cola, Declaracion de la clase Array... Definicion de la clase Array... Declaracién de la clase Pla. Definicin dela clase Pila... Declaracion dela clase Cola.. CH Defnicion dela clase Col 259 Usar Ia pila y la cola. wn 262 Resumen... Actividades Polimorfismo Qué es el polimorfismo? ‘Sobrecarga de funciones. Parametrosopcionales Sobrecarga de operadores. El morlicadr rit nan Sobrecarga de operadores unarios ‘Operadores que no modifcan elestado del objeto 282 Operadores que modifican el estado del objeto...263 Sobrecarga de operadores binavios. Métodos virtuales Destructores virtuales. Resumen... Actividades Objetos persistentes {Qué es un objeto persistente?. ‘Manejo de archivos en C+... Escritura de un archivo. Lectura de un archivo. Lectura y escritura de datos binarlos. 34 Almacenar el estado de un objeto Objetos con punters. Resumen Actividades. {Pot mach dts opanatrinos xc eit [Bia bie ble ‘[Link] (eho) 2. tain cr iacamiend crac acho yb eames unt doen, bla ble bla ‘sJemplotat (eho) sxBuf (memoria) 2am een Patrones de disefio {Qué es un patrén de diseRo E! patrén Singletos El patron Método Plantil.. El patron Fabrica. El patron Estrategia. El patrén Observador Resumen [Link] <« lo GES Lenguaje Unificado de Modelado Introduccion. Diagramas de Casos de uso... Diagramas de Clases.. Diagramas de Objeto: Diagramas de Secuencia . Diagramas de Estado: Diagramas de Colaboracion.. ad, Diagramas de A Diagramas de Componentes Estructuras de datos jamicas y plantillas Listas enlazadas 2Qut es una lista enlazada. Implementacion de lista enlazada .. Laclase Nodo Laclase Lista... >> [Link] PRELIMINARES Plantillas... Listas dablemente enlazadas con plantillas......47 Pil Clans Los iteradores. Resumen... Actividades... | Anc _,,, La libreria de plantillas STL La libreria ST Las clases contenedoras. La clase vector. La case list... La clase stack. La clase queue... La clase map Resumen 2 BSS PRELIMINARES, Introduccion » Este libro esta dirigido principalmente al programador novato y de nivel medio, asi como al estudiante o al autodidacta. Los primeros cuatro capitulos son Introductorios, y alli explicaremos detalladamente cuales son los fundamentos del lenguaje, su sintaxis y sus sentencias basicas. También veremos como realizar nuestro primer programa. Llegando a la mitad del libro profundizaremos los conceptos relacionados con la programacién orientada a objetos, Descubriremos qué es un objeto cuando hablamos de C++ y como tratar con él. Si usted es estudiante del nivel terciario o universitario de alguna carrera relacionada con la programacion, seguramente encontraré muy titil el capitulo 5, en el que se explican algunos conceptos mas avanzados, como la gestién dinamica de la memoria. Por otro lado, si es un programador practico, tal vez desee utilizar las estructuras de datos de la libreria STL; en el apéndice C veremos en detalle como emplearla. Entre otros temas, descubriremos qué es un iterador, qué es un contenedor y como hacer uso de ellos. Finalizado el libro, sera capaz de crear sus propias aplicaciones C+ haciendo uso de las herramientas de disefio adecuadas. Con los conceptos aprendidos y los ejemplos vistos, estara preparado para comenzar a experimentar y realizar diversos proyectos. Todos los temas son tratados a través de diagramas visuales y ejemplos practicos, en busqueda de facilitar la comprensién de los conceptos. >> [Link] ESATA Programacion orientada a objetos En este primer capitulo, comenzaremos por conocer qué es la programacion orientada a objetos y en qué puede ayudarnos. También veremos sus conceptos principales, la evolucion del diseno y una introduccion a la construccion de sistemas complejos. is y el disefio en la os vy Introduccién y El anil Programacién no estructurada......15 programacién orientada Programacién procedural a objetos. Programacién modular El lenguaje unificado Programacién orientada a objetos.. de MOdELAMO nnrnenenannene A 2Qué es un objeto?. - Mas caracteristicas de los objetos...19 _» Resumen. Ain mas caracteristicas de los objetos vw 20 Actividades. AAA 14 BSS 1, PROGRAMACION ORIENTADA A OBJETOS ©) Introduccion Queremos utilizar la computadora para resolver problemas, ino es asi? Podria ser un problema propuesto por un profesor de la facultad en un enunciado, el calculo del saldo de una cuenta bancaria o la programacién de un juego. El asunto es que para esto deberemos trasladar dichos problemas a nuestra PC, y este proceso de traslacién implica una abstraccién. Tal vez el término resulte extrafo, pero desde nifos estamos acostumbrados a realizar abstracciones: en aquellos tiempos, a veces jugébamos a ser otra persona situada en otro mundo; incluso la bafiera podia convertirse en un mar embravecido. Tales ejemplos no son otra cosa que abstracciones, modelos de una realidad llevada a otro contexto por medio de una operacién intelectual. Como deciamos, para trasladar un problema a la PC, también realizamos abstracciones; 0 sea, debemos crear un modelo simplificado de la realidad tomando los elementos que nos parezcan pertinentes y transformandolos en variables, por ejemplo, dentro de un programa. De este modo, nuestra maquina podrd entenderlo, ejecutarlo y, finalmente, habremos obtenido el resultado que estébamos buscando. Programa l Problema ——> [7 Figura 1. Para introducir un problema en una computadora, debemos realizar un proceso de abstraccién. Para esto, sin duda, deberemos acudir a un lenguaje de programacién, que no es otra cosa que una herramienta. El lenguaje nos permitird especificar, a modo de instrucciones, cudles son los pasos que tendra que seguir la computadora para resolver el problema. Pero cémo especifiquemos la solucién dependera del modelo de programacién que utilicemos. Entonces, lo mejor sera repasar un poco los modelos mas comunes. >> [Link] CH Gas 15 Programacion no estructurada Si no estamos empleando ningtin modelo de programacion en particular, probablemente estemos programando de modo no estructurado. La programacién no estructurada consiste en un programa extenso desarrollado { dentro de una funcién principal que utiliza solo variables del tipo global. Este modo de programaci6n puede ser aceptable para la resoluci6n de problemas triviales; sin embargo, a medida que la complejidad se incrementa, comienza a ser muy engorroso su mantenimiento y el agregado de nuevas caracteristicas. Figura 2. En la programacin no estructurada es dificil seguir el flujo de ejecucién. Programaci6n procedural La mayor parte de los lenguajes de alto nivel soportan la creacion de procedimientos, que son trozos de cédigo que realizan una tarea determinada. Un procedimiento podra ser invocado muchas veces desde otras partes del programa con el fin de aislar la tarea en cuestion y, una vez que finaliza su ejecucién, retorna al punto del programa desde donde se realizo la llamada. Ademas, cada procedimiento tendra su propio conjunto de datos, aunque podra acceder a datos globales y a los pasados como parametros desde el programa principal o desde otros procedimientos. De esta forma, podemos dividir nuestro problema en problemas mas pequeiis y, asi, levar la complejidad a un nivel manejable. E Programa principal _ i bi] p2 3 Figura 3. Programacion procedural en programas pequefios o medianos. [Link] — «« CRUSERS| 1, PROGRAMACION ORIENTADA A OBJETOS Figura 4. Programacién procedural en un programa de tamafio mayor. Programacion modular La programacién modular va un paso mas alla con la creacion de procedimientos: los agrupa en médulos segun su funcién. De esta manera, el modelo es apto para sistemas mas complejos que requieren programas mis extensos. Cada médulo tendra su propio conjunto de datos, creando un nivel intermedio de datos globales, ya que el conjunto de datos del médulo sera global para los procedimientos del médulo, pero inaccesible a los brogyama principal procedimientos de otros médulos. De este modo, la representacién de un determinado concepto del problema podra A ser llevado a un médulo; por ejemplo, » bs. ‘ ‘g T t T T la manipulacion de archivos, donde dentro 2 [pt del médulo en cuesti6n existiran distintas tt funciones para su creacién, destruccion, ps lectura, escritura, etcétera. Médulo 1 Médulo 2 Figura 5. En la programacién modular, cada médulo agrupa procedimientos. Programacion orientada a objetos En la programacién orientada a objetos, el concepto de médulo es profundizado y se transforma en un objeto. Ademés, alli, un programa >> [Link] IE SSOSSSCCCCG En este capitulo haremos una introduccién al lenguaje C++, expondremos sus principales virtudes, estudiaremos los elementos que lo componen y cémo crear programas con él. + 2Qué es un lenguaje de programe Proceso de compilacién. Proceso de enlace.... Entornos de programacié I esse ¥ Un poco de historia Diferencias entre Cy [Link] 34 y Primer programa en C++. Comentarios Variables. Las palabras reservadas de CH [Link] nn 38 + Asignacién, + Constantes. + Tipos de datos El operador sizeof. Caracteres El tipo de dato void. Booleanos. y Operadores, Precedencia de operadore: -y Control del flujo de ejecucion.51. ‘Sentencias condicionale: Sentencia de bucle... y Resumen. + Actividades. ws AAA 30 Gas 2. FUNDAMENTOS DE C++ al Que es un lenguaje »> de programacion? Un lenguaje de programacién es, principalmente, una herramienta. Por medio de él podremos indicarle a nuestra computadora qué pasos debe seguir para resolver un determinado problema. Estos lenguajes suelen ser clasificados segiin distintos criterios; uno de ellos es su cercania al lenguaje realmente comprendido por la plataforma. Los lenguajes de bajo nivel son los mas cercanos a la arquitectura de la computadora, y el ensamblador es uno de ellos. Por otro lado, los lenguajes de alto nivel utilizan sentencias similares al lenguaje natural empleado por los seres humanos; de este modo, son mas faciles de aprender y, ademas, pueden ser trasladados a distintas arquitecturas por no poseer un cédigo intimamente relacionado con estas. En este grupo se encuentra la mayor parte de los lenguajes, como el C, C++, Pascal, Fortran, Basic, etcétera. Proceso de compilacion Ahora bien, tal vez nos preguntemos como es que si programamos utilizando sentencias en lenguaje similar al natural, en cualquiera de los lenguajes conocidos, la maquina puede entenderlo. Para esto, existe un proceso mediante el cual se traduce dicho cédigo a un lenguaje entendible por la computadora. Proceso de compilacién ‘archive main-¢pp fon nnn TarenIVO MBTTOD] “archivo [Link] “archivo treeepp | archivo tres.0b)_| ‘uestro programa Figura 1. Un proyecto esta formado por un grupo de archivos de codigo. Cada archivo de cédigo se compila de manera individual. [Link] CH CaS 31 A este proceso se lo denomina compilacion, y los programas que lo realizan se denominan compiladores. Normalmente cuando nuestro programa crece en cantidad de lineas, el proyecto suele ser dividido en diversos archivos de codigo. Proceso de enlace Luego, terminado el proceso de compilacién, habremos obtenido una serie de archivos (con terminacién obj) que deberemos juntar para crear un archivo ejecutable. El proceso que une estos archivos y les adjunta ademas otros componentes, segtin corresponda, se denomina enlace, y el programa que realiza esta funcién es el enlazador. E] archivo de salida a este es un proceso ejecutable. Proceso de compilacién Proceso de enlazado Compilador C++ Enlazador Figura 2. Procesos de compitacién y enlace. Entornos de programacion Parece complicado... ¢Compilar y luego enlazar? ;Como hacemos todo esto? Bueno, podriamos decir que somos afortunados: en la actualidad existen muchos entornos de desarrollo donde todos estos procesos se realizan mediante un simple golpe de tecla. La eleccién de qué entorno utilizar se deja a criterio del lector. Sin embargo, en el Apéndice B se recomiendan algunos de los mas populares para el sistema operativo Microsoft Windows. [Link] — «« 32 CESS 2. FUNDAMENTOS DE C++ Es importante hacer la distincién entre un entorno de desarrollo y un compilador: el entorno es simplemente una aplicacién -usualmente, de ventanas- que nos permite gestionar un proyecto de programacion de manera sencilla; el entorno de desarrollo, por su parte, utiliza el compilador y el enlazador autométicamente. Ademas, los entornos modernos colorean distintas palabras de nuestro codigo en funcion de las sentencias reconocidas del lenguaje, y esto mejora muchisimo la legibilidad del cédigo. Y existen otras tantas funciones mas que realiza el entorno para facilitarnos la vida, como ser: Permitir la configuracion de los parametros del compilador y el enlazador de manera sencilla. © Mostrar el nombre de las estructuras de datos empleadas en nuestro proyecto para poder acceder a ellas facilmente. Facilidades de busqueda avanzada. * Facilidades de impresion. * Muchos entornos incluyen un depurador integrador para realizar un seguimiento paso a paso de la ejecucion de nuestro programa. ©) Un poco de historia El lenguaje C fue desarrollado en los laboratorios Bell durante la década del 70, y proviene de otro lenguaje llamado B, que a su vez desciende de otro lenguaje llamado BCPL. Inicialmente, el lenguaje C fue desarrollado como un lenguaje de programacién para escribir y mantener el sistema operativo UNIX, luego fue expandido para trabajar en otros sistemas. A medida que el lenguaje crecié y maduré fue tornandose mas popular. Actualmente, sus principales caracteristicas son: See Esta division se reaiza con la intencion de disminuir la complejidad en ta organizacion de nuestro proyecto. Cada uno de estos archivos de cédigo es compilado de manera individual. >> [Link] ESATA Aspectos avanzados del lenguaje En este capitulo, aprenderemos a interactuar con el usuario por medio de una terminal de texto. Veremos también qué es un array, comenzaremos a trabajar con variables que contengan texto y crearemos nuestras propias funciones. + Entrada y salida en C++... El objeto cout . El objeto cin Funciones para la manipulacién de estrings. Estructuras Uso de una estructura... Funciones que retornan valores ....93 Funciones con pardmetros ‘Arquitectura de un programa comple y Los string en C++. -y Resumen. + Actividades. US AAA 4 BSS 3. ASPECTOS AVANZADOS DEL LENGUAJE ») Entrada y salida en C++ El lenguaje C+4, al igual que el lenguaje C, no incluye primitivas para realizar opciones de entrada/salida. En su lugar, existen librerias esténdar que nos permiten, por ejemplo, escribir en la pantalla 0 tomar un caracter del teclado, es decir, manipular los flujos de entrada/salida a nuestro gusto. Un flujo (en inglés, stream) no es otra cosa que una secuencia de bytes que provienen de una fuente (flujos de entrada) o van hacia algun destino (flujos de salida). Al utilizar este concepto, C+ se desvincula de cual sea la fuente o el destino concreto; un flujo de salida podria ser la pantalla o un archivo, y todo se manejaria basicamente del mismo modo. El lenguaje C define inicialmente tres flujos estandar: © stdin, el flujo de entrada (conectado por defecto a la entrada del teclado) © stdout, el flujo de salida (conectado por defecto a la pantalla de la terminal); © stderr, un flujo de error (también conectado por defecto a la pantalla de la terminal). aa flujos de entrada Tujos de salida [archive Figura 1. Flujos de entrada/salida en un programa C++ El lenguaje C++ hereda estos conceptos de C y agrega los siguientes tres objetos globales para manipularlos: * El objeto cin, para manipular el flujo stdin. © El objeto cout, para manipular el flujo stdout. © El objeto cerr, para manipular el flujo stderr. Para poder utilizar estos objetos, bastard con que incluyamos el archivo de cabecera iostream del siguiente modo: >> [Link] CH 5 #include Ademas, estos objetos, por estar definidos dentro del conjunto de datos estandar del lenguaje, se encuentran bajo el espacio de nombre std (abreviacién de “estandar”). Por lo tanto, siempre debemos anteponer std:: a su uso. Por ejemplo: std::cout << “el texto va aqui”; En lugar de anteponer siempre std, también podemos especificarlo al comienzo del programa using namespace std; Pero... gqué es un espacio de nombre? Dentro de una liberia, existe una gran cantidad de declaraciones que especifican identificadores para cada tipo de dato. ;Qué sucederia si utilizaramos un nombre ya existente en una libreria para un tipo de dato creado por nosotros? El compilador arrojaria un error, por lo que nosotros deberiamos cambiar el nombre de nuestro tipo de dato. éQué sucederia si desearamos utilizar dos librerias que declarasen dos identificadores con el mismo nombre? En ese caso, modificar el cédigo seria muy trabajoso, ya que dicha libreria no fue escrita por nosotros. A modo de analogia, el lector podria pensar qué sucederia si el sistema de archivos utilizado por su sistema operativo no permitiera la creacién de subdirectorios, es decir, si todos y cada uno de los. archivos que contuviera su disco duro debiesen estar en el directorio raiz, (Seria un problema tener que estar renombrando archivos para que no existan dos con el mismo nombre! Un espacio de nombre (en inglés, namespace) en CH seria equivalente a un directorio en un sistema de archivos. Asi como pueden existir dos archivos con el mismo nombre dentro de dos directorios distintos, pueden existir dos identificadores iguales en distintos espacios de nombres. [Link] — «« 7 GES 3. ASPECTOS AVANZADOS DEL LENGUAJE Para declarar una variable dentro de un espacio de nombres en particular, simplemente debemos proceder del siguiente modo: namespace MiEspacioDeNombre ‘ int iMiVariable, Por lo tanto, el siguiente listado de cédigo es incorrecto: int Valor; int iValor; Pero el siguiente no: namespace Ns1 « int iValor; ) namespace Ns2 ¢ int iValor; Ahora bien, si queremos utilizar la variable declarada dentro de nuestro programa, tendremos que especificar el espacio de nombre al cual deseamos referirnos; de otro modo, el compilador slo buscar el identificador en el espacio de nombres global. namespace Ns1 ‘ int iValor; ) namespace Ns2 >> [Link] IE SSOSSSCCCCG Ya hemos realizado una introduccion al lenguaje; ahora comenzaremos a ver temas relacionados especificamente con la programacién orientada a objetos. Profundizaremos aspectos del lenguaje C++ a partir del estudio de una de sus estructuras principales: la clase. + Laclas 134 y Métodos estaticos ... Las funciones miembros 0 métodos 137 Restricciones de los métodos St8C08 nn 157 El diagrama de clases. -y El juego de la vida La resolucié La propiedad... Los métodos. y El diagrama de objetos.. y El constructor... La funcion main. + El destructor. Patrones de interés, + Modificadores de acest y Resumen. + Propiedades estaticas. + Actividades. AAA 4 BSS 4. CLASE Y OBJETO +) La clase Una clase es una estructura de datos. Su objetivo, como el de la estructura (struct), es crear nuevos tipos de datos para ser utilizados en un programa. De hecho, la estructura posee muchisimas similitudes con las clases, especialmente en C++. Recordemos que una estructura nos permite manejar un conjunto de datos como un elemento tinico. Esto es especialmente itil cuando el conjunto de datos posee una estricta relacion entre si y conforma una entidad. En el capitulo anterior, vimos el ejemplo de un automovil en el que colocamos unas cuantas propiedades relacionadas con él dentro de una estructura. Una clase nos permite ir un paso mas alla; no solo podremos declarar tipos nuevos especificando sus propiedades, sino que podremos incluir funciones que, por supuesto, también estaran muy relacionadas con la entidad en cuestion. Supongamos que deseamos implementar una aplicacion en la cual requerimos modelar el concepto de un televisor. Para ello, consideraremos algunas de sus propiedades y estableceremos como regla que las propiedades de sintonia (m_uiCanal) y nivel de sonido (m_uiVolumen) solo deberian poder modificarse cuando el televisor esté encendido (m_bEncendido en verdadero) struct Televisor « bool m_bEncendido; M Indica si la TV esta encendida unsigned int m_uiCanal; —_/! Indica sintonia del televisor unsigned int m_uiVolumen; // Indica nivel de sonido % Ahora, si deseéramos crear un televisor en nuestra aplicacién, deberiamos crear una variable a partir de él del siguiente modo: int main() ( Televisor tv]; >> [Link] CH Geass 135 ion Siguiendo con el ejemplo, si nuestra intencién es cambiar el valor de la propiedad m_uiVolumen, bastaria con escribir: tv1.m_uiVolumen = 10; Pero esto no siempre podra ser correct, Habiamos establecido que el nivel del sonido podria ser modificado cuando el televisor estuviera encendido, por lo tanto, tendriamos que haber codificado: if (tv1.m_bEncendido) tvi.m_uiVolumen = 10; Entonces, el hecho de que el programador modifique el nivel de sonido cuando el televisor esté apagado queda bajo estricta responsabilidad. cEs esto lo que queremos? Pues no. Lo ideal seria poder establecer ciertas reglas en una entidad y que de ningiin modo otro programador pudiera alterarlas; en definitiva, algo mas parecido aun televisor real, es decir, si no se puede variar el nivel de sonido cuando el aparato se encuentra apagado, como usuarios, nada podemos hacer mas que obedecer las reglas. Como una alternativa encaminada a subsanar este problema, podriamos crear una funcién que modificara el nivel de sonido del aparato, que retorne verdadero si lo ha podido hacer y falso de otro modo: deh a achadsiihctiicia ace Como se puede ver en la funcién ModificarVolumen, para el parémetro Televisor hemos utiizado Una referencia en lugar de hacer un pase por valor. Esto es corveniente por dos motivos: Deseamos modifica el objeto original y no una copia que sera finalmente destruida Pasar una direccién de memoria es mas eficiente que copiar las propiedades de una estructura, [Link] — «« 136 CESS 4. CLASE Y OBJETO boo! Modificar'Volumen(Televisor & ty, unsigned int uiVolumen) ‘ if (tvm_bEncendido) c tv.m_uiVolumen = uiVolumen; return true; ) else return false; ) Entonces, ahora podriamos utilizar esta funcién de la siguiente manera’ int main ¢ Televisor tv]; 1/ Modifico el nivel de sonido de tv ModificarVolumen(tv1, 10); return 0; Es necesario hacer el pase de tv1, ya que podriamos poseer varios objetos del tipo Televisor, y la funcién requiere saber a qué estructura debe modificar sus datos. De modo andlogo, podriamos crear otras funciones relacionadas con el televisor: void Encender(Televisor & tv) ( Tv.m_bEncendido = tue; d void Apagar(Televisor & tv) ( >> [Link] WO En este capitulo veremos cémo solicitar memoria en forma dinamica por medio de los punteros. De esta manera podremos crear objetos dinamicamente y hacer uso mas eficiente de los recursos de la computadora. Veremos también qué son las referencias y cuando es conveniente utilizarlas sobre los punteros. + Los punteros Como dectarar una variable tipo puntero.. El operador new.. Operador delete. Punterosa array. 178 178 Cadenas de texto ‘Aritmética de punteros 186 Las referencias. 2191 Los punteros como parametros de funciones... on 192 Los punteros como valor de retorno, Variables estaticas... + Puntera a objetos. Las propiedades. Utilizar la clase Cadena. El constructor de copia... y Resumen. + Actividades. AAA 14 BSS 5. GESTION DE MEMORIA +) Los punteros Si alguna vez escuchamos hablar de punteros, seguramente la frase fue acompafada de la palabra “dificil’. Sin embargo, no tiene por qué ser asi. Un puntero es basicamente una construccién del lenguaje que nos permite obtener mas control de la memoria de la computadora. Con él podemos crear objetos en forma dinamica y asi utilizar eficientemente los recursos del sistema. Supongamos que deseamos almacenar una cierta cantidad de notas de un alumno en alguna estructura de datos. Si bien ya estudiamos este mismo ejemplo cuando vimos los array, ahora agregaremos un condimento extra: la cantidad total de notas de un alumno s6lo se conoce cuando comienza a ejecutarse el programa, y puede variar de ejecucion a ejecucion. Antes, bastaba con crear un array de una determinada cantidad de elementos y listo, pero ahora, iqué haremos? Una solucién posible seria crear un array absurdamente grande para que se puedan almacenar todas las notas que sean necesarias en cualquier caso. // Creo un array de un tamafio suficientemente grande int aiNotast1000]; Pero esta solucién tiene dos defectos: # En algunos casos, podria no existir un maximo posible, es decir, la cantidad de elementos es realmente desconocida y puede ser tanto 5 como 250 o 100 000. © Realizamos un uso muy poco eficiente de los recursos. Si, por ejemplo, creamos un array de 1000 elementos y luego usamos tan solo 10, estaremos desaprovechando muchisima memoria. Una solucién que podriamos imaginar seria crear un array de tamafo especificable durante el tiempo de ejecucién. De todas maneras, el compilador exige que el valor encerrado entre corchetes en la definicién de un array sea una expresién constante, es decir, un valor conocido en tiempo de compilacién. Por esa razén no se permite el siguiente cédigo: >> [Link] CH Geass 15 int TamArray; cout << “Ingrese el tamafio del array cin >> iTamArray; cout << endl; 11 La siguiente expresion es INVALIDA, iTamArray no es una expresion constante int aiNotasliTamArray]; JI Sigo trabajando con aiNotas Mins Como excepcién a la regla, el compilador gee 3.2 si acepta el cédigo anterior. Para poder crear un array en el que su tamatio sea especificado en tiempo de ejecucién, tendremos que solicitar memoria en forma dindmica utilizando punteros. Un puntero es una variable que no almacena directamente un dato, sino una direccién de memoria en la que se encuentra el dato en cuestién. Como declarar una variable tipo puntero Supongamos que deseamos crear una variable puntero; para ello, deberemos especificar, como con cualquier otra variable, cual es su tipo. Veamos: 17 Una variable puntero a un nimero entero int * pA; Notemos que la declaracién es muy similar a la de una variable convencional, solo que aqui, por ser un puntero, colocamos un signo asterisco (*) entre el tipo de dato y el identificador. pA es, entonces, una variable que contendré una direccién de memoria donde habra un ntimero entero. Sin embargo, gen qué posicion estard el numero entero? Atin no lo hemos determinado, simplemente existe el contenedor de la direccién, pero todavia no se establecié qué [Link] — «« le CESS 5. GESTION DE MEMORIA direccién sera; el puntero, como cualquier otra variable, comienza con un valor basura en su interior: pA | igura 1. Un puntero aiin no inicializado. Si en nuestro programa existiese otra variable entera, podriamos establecer que nuestro puntero apuntara a ella del siguiente modo: 1] Declaro una variable entera convencional y Ia inicializo en 10 int {UnaVariableEntera = 10; 11 Declaro un puntero a variable entera int * pA; J hora le asigno la direccién de memoria donde se encuentra iUnaVariableEntera Mal puntero pA pA = & iUnaVariableEntera; iUnavariableEnters (OxFFFFO102) E ! pA — (OxFFFFOL01) [_ OxFFFFOLo2 Figura 2. El contenido de la variable sera un valor, y el contenido del puntero sera una direccién de memoria. Notemos que, para obtener la direccién de memoria que le fue asignada a la variable entera iUnaVariableEntera, utilizamos el operador & (“direccién de"). Ahora es posible modificar el valor de la variable entera no solo por medio de ella, sino también por medio del puntero. Para esto, no deberemos hacer lo siguiente: >> [Link] SY Herencia En este capitulo abordaremos herencia y composicién, recursos fundamentales en el momento de crear el modelo de datos de nuestro sistema. Veremos cémo trabajan los constructores y destructores dentro del mecanismo de herencia y crearemos una pila y una cola utilizando un array. {Qué es la herencia?. yHerencia maltiple i caso del diamante. ws 76250 de eStUldlOvnrennnnninn 246 {Como funciona una pil, one 246 en la herencia 225 Cémo funciona una cola 206 El modificador de acceso protected227 —_Declavacion dela clase Arranomn251 Invocacién de constructoresnu.233 _‘Definicin de la clase Array -252 Invocacion de destructores Declaracion de la las Pla une 255 CConstructores con pardmetros. Definicon de a las PH. nner 256 Declaracion de la clase Cola......258 + CompOSiCIOM wan. Defnicin de la clase Col enue 259 Usar la play la cola. 1.262 + Ocultar el nombre de un métotlo ¥ Compasicién vs. herencia.. AAA Py BEUSERS| 6. HERENCIA a Qué es la herencia? La herencia es un concepto fundamental de la programacion orientada a objetos. Por medio de esta caracteristica podremos definir nuestras clases a partir de otras mas generales y solo agregar las propiedades y métodos de la especializacién. En el Capitulo 1 habiamos hecho una introduccion a este tema. Habiamos comentado que el modo en que funcionaba la herencia tenia mucho que ver con la forma en que definimos elementos empleando la tradicién aristotélica, es decir, nos basamos en un objeto conocido para luego especificar las diferencias que dan origen al nuevo elemento. Debido a que nuestro sistema sera una coleccién de clases relacionadas entre si, es muy importante ver como estaré confirmada su estructura Por lo general, un disefto pobre genera mas problemas que soluciones, ya que los errores se propagan rapidamente y se torna mas dificil su expansion y mantenimiento. Volvamos al ejemplo de los dispositivos electrénicos del Capitulo 1. Ahora veremos cémo codificar dicho ejemplo en C++. En principio, huestro interés era incorporar al sistema la entidad Televisor y la entidad Radio, debido a que son dispositivos electronicos que poseen caracteristicas en comin, y, gracias a la programacin orientada a objetos, podremos realizar el modelo de un modo muy natural. Crearemos una clase llamada DispElectronico, que representara un dispositivo electronic con caracteristicas comunes a estos, de modo que luego agregaremos la clase Televisor y la clase Radio, ambas subclases de DispElectronica. Veamos: class DispElectronico ce i indica si el dispositivo se encuentra encendido 0 apagado bool m_bEncendido; public: M Constructor DispElectronico(); WEnciende el dispositive void Encender() {m_bEncendido = true; } I Apaga el dispositive >> [Link] cH Cea5 221 void Apagar() { m_bEncendido = false; + W Indica si el aparato est encendido bool EstaEncendido() cons ( return m_bEncendido; ) Analicemos un poco la declaracién anterior, ya que estamos haciendo algo nuevo: * La clase solo posee una propiedad, que es privada y representa el estado del aparato. * Ademas, cuenta con cuatro métodos publicos: el constructor (siempre Heva el mismo nombre que la clase y no posee tipo), un método para “encender’ el dispositivo (cambia el valor de la propiedad m_bencendido), otro para “apagarlo” y, finalmente, un método que retorna el valor de la propiedad (no es posible accederla de otro modo porque es privada). Meétodos inline Los métodos pueden ser definidos dentro de la misma clase. Hasta aqui siempre realizabamos la declaracién en un archivo de cabecera (terminacién .h): class X { 11 Dectaracién del método void ml); Y Iuego, lo definiamos en un archivo de cédigo fuente (con terminacion .cpp): void X::mL() { W.. [Link] — «« P77 Ma USERS| 6. HERENCIA Pero veamos el siguiente caso class X ( I Declaracién de! método void m10 ( Was Ahora hemos introducido una novedad: la declaracion y definicion conjunta dentro del cuerpo mismo de la clase. Todo esto, en el archivo de cabecera. Por otra parte, ambas son maneras correctas de definir un método, y su modo de uso es exactamente el mismo. Entonces, gcual es la diferencia? {Cuando usar un modo de definicién y cudndo el otro? Los métodos declarados dentro del cuerpo de la clase son del tipo inline, algo que podriamos lograr realizando una definicién clasica y antepontendo esta palabra al tipo: inline void X::m10 « ae {Qué quiere decir esto? Normalmente, cuando realizamos una llamada una funcion o método, el compilador debe Introducir una serie de operaciones en cécligo ensamblacior para el pasaje de parametros y para resguardar clertos registros del CPU que seran restablecidos al retorno, Por lo tanto, si estos pasos no estuviesen y el codigo propio de la funcién fuera copiado, en lugar de realizar dicha llamada, nos estariamos ahorrando algunas operaciones que, en clerto tipo de sistemas con funciones muy solicitadas, pueden hacer una diferencia. Las funciones o métodos inline poseen la caracteristica de no ser funciones reales, sino que el compllador se toma el trabajo de >> [Link] ESCA Polimorfismo En este capitulo estudiaremos el polimorfismo, tercer gran pilar de la programacién orientada a objetos. También estudiaremos qué mecanismos implementa el lenguaje para dar soporte a esta caracteristica: entre ellos, la sobrecarga de funciones y operadores, los métodos virtuales y las clases abstractas. + ZQué es el polimorfismo? y Sobrecarga de funciones... Parametros opcionales y Sobrecarga de operadores..274 El modificador friend. 276 Sobrecarga de operadores unaios... 279 Operadores que no modifican cl estado del objeto. Operadores que modifican el estado del objeto. 282 283 Sobrecarga de operadores binaries. -y Métodos virtuales. + Destructores virtuales. y Resumen. + Actividades. AAA 266 CESS 7. POLIMORFISMO al éQué es el polimorfismo? En pocas palabras, el polimorfismo es la habilidad que poseen los objetos para reaccionar de modo diferente ante los mismos mensajes. Un objeto del tipo Puerta, al igual que un objeto de tipo Ventana, podra recibir el mensaje Abrir; sin embargo, cada uno de ellos reaccionara de modo diferente. En C++ el polimorfismo se encuentra intimamente relacionado con el mecanismo de sobrecarga y los métodos virtuales. Veamos de qué se trata esto. a Sobrecarga de funciones En lenguajes como el C, es comtin encontrar librerfas que poseen grupos de funciones que realizan la misma tarea pero con distintos tipos de datos en los parémetros. De este modo, si la tarea consiste en mostrar en pantalla el dato pasado como parametro, podremos encontrarnos con casos como el siguiente void ImprimirlntCint iNum); void ImprimirChar(char cCar); void ImprimirFloat(float fNum); El lenguaje C++ provee un mecanismo mucho mas conveniente para realizar la misma tarea. Es posible crear funciones que tengan el mismo nombre y difieran en la cantidad y/o tipo de parametros. Teniendo esto en cuenta, el ejemplo anterior podria ser reescrito como: void Imprimir(int iNum); void Imprimir(char cCar); void Imprimir(float fNum); >> [Link]

También podría gustarte