Prefacio... xv 1. Orígenes de la programación orientada a objetos... 1 1.1 La crisis del software... 1 1.2 Evolución del software... 3 1.3 Introducción a la programación orientada a procedimientos... 4 1.4 Paradigma de programación orientada a objetos... 6 1.5 Conceptos básicos de la programación orientada a objetos... 7 1.6 Ventajas de la POO... 12 1.7 Lenguajes orientados a objetos... 13 1.8 Aplicaciones de la POO... 14 RESUMEN... 15 Preguntas de repaso... 17 2. Introducción a C++... 19 2.1 Qué es C++?... 19 2.2 Aplicaciones de C++... 20 2.3 Ejemplo de programa C++... 20 2.4 Más instrucciones C++... 25 2.5 Un ejemplo con clases... 28 2.6 Estructura de un programa C++... 29 2.7 Creación de un archivo fuente... 30 2.8 Compilación y enlazado... 31 RESUMEN... 32 Ejercicios de revisión... 33 Ejercicios de depuración... 33 Ejercicios de programación... 34 vii
viii Contenido 3. Tokens, expresionesy estructuras de control... 35 3.1 Introducción... 35 3.2 Tokens... 36 3.3 Palabras reservadas... 36 3.4 Identificadores y constantes... 36 3.5 Tipos de datos básicos... 38 3.6 Tipos de datos definidos por el usuario... 40 3.7 Tipos de datos derivados... 42 3.8 Constantes simbólicas... 43 3.9 Compatibilidad de tipos... 44 3.10 Declaración de variables... 45 3.11 Inicialización dinámica de variables... 46 3.12 Variables referencia... 46 3.13 Operadores en C++... 49 3.14 Operador de resolución de ámbito... 49 3.15 Operadores de desreferenciación de miembros... 52 3.16 Operadores de gestión de memoria... 52 3.17 Manipuladores... 55 3.18 Operador de conversión de tipo... 56 3.19 Expresiones y sus tipos... 57 3.20 Expresiones especiales de asignación... 59 3.21 Conversiones implícitas... 60 3.22 Sobrecarga de operadores... 61 3.23 Precedencia de operadores... 62 3.24 Estructuras de control... 63 RESUMEN... 68 Preguntas de repaso... 70 Ejercicios de depuración... 71 Ejercicios de programación... 73 4. Funciones en C++... 77 4.1 Introducción... 77 4.2 La función principal... 78 4.3 Prototipado de funciones... 79 4.4 Llamada por referencia... 81 4.5 Retorno por referencia... 82 4.6 Funciones inline... 82 4.7 Argumentos predeterminados... 84 4.8 Argumentos constantes (const)... 87 4.9 Sobrecarga de funciones... 87 4.10 Funciones amigas (friend) y virtuales (virtual)... 90 4.11 Funciones de la librería matemática... 90 RESUMEN... 91 Ejercicios de revisión... 92 Ejercicios de depuración... 93 Ejercicios de programación... 94
ix 5. Clases y objetos... 97 5.1 Introducción... 97 5.2 Revisión de las estructuras C... 98 5.3 Especificación de una clase... 100 5.4 Definición de funciones miembro... 104 5.5 Un programa C++ con clases... 106 5.6 Conversión de una función externa en función en línea... 107 5.7 Anidamiento de funciones miembro... 108 5.8 Funciones miembro privadas... 109 5.9 Arrays dentro de una clase... 110 5.10 Reserva de memoria para objetos... 115 5.11 Miembros de datos estáticos... 115 5.12 Funciones miembro estáticas... 118 3.3 Arrays de objetos... 120 5.14 Objetos como argumentos de funciones... 123 5.15 Funciones amigas (friend)... 125 5.16 Devolución de objetos... 131 5.17 Funciones miembro const... 132 5.18 Punteros a miembros... 133 5.19 Clases locales... 135 RESUMEN... 136 Preguntas de repaso... 137 Ejercicios de depuración... 138 Ejercicios de programación... 141 6. Constructores y destructores... 143 6.1 Introducción... 143 6.2 Constructores... 144 6.3 Constructores parametrizados... 145 6.4 Múltiples constructores en una clase... 148 6.5 Constructores con argumentos predeterminados... 151 6.6 Inicialización dinámica de objetos... 152 6.7 Constructor copia... 155 6.8 Constructores dinámicos... 157 6.9 Construcción de arrays de dos dimensiones... 159 6.10 Objetos constantes... 161 6.11 Destructores... 161 RESUMEN... 164 Ejercicios de revisión... 165 Ejercicios de depuración... 165 Ejercicios de programación... 168 7. Sobrecarga de operadores y conversiones de tipo... 171 7.1 Introducción... 171 7.2 Definición de la sobrecarga de operadores... 172
x Contenido 7.3 Sobrecarga de operadores unarios... 173 7.4 Sobrecarga de operadores binarios... 176 7.5 Sobrecarga de operadores binarios usando funciones amigas (friend) 179 7.6 Manipulación de cadenas utilizando operadores... 183 7.7 Reglas para la sobrecarga de operadores... 186 7.8 Conversiones de tipo... 187 RESUMEN... 195 Ejercicios de Revisión... 196 Ejercicios de Depuración... 197 Ejercicios de Programación... 199 8. Herencia: Extensión de clases... 201 8.1 Introducción... 201 8.2 Definición de clases derivadas... 202 8.3 Herencia simple... 204 8.4 Cómo heredar un miembro privado... 210 8.5 Herencia multinivel... 212 8.6 Herencia múltiple... 218 8.7 Herencia jerárquica... 223 8.8 Herencia híbrida... 224 8.9 Clases base virtuales... 228 8.10 Clases abstractas... 232 8.11 Constructores en clases derivadas... 232 8.12 Clases miembro: Anidación de clases... 239 RESUMEN... 240 Preguntas de repaso... 242 Ejercicios de depuración... 243 Ejercicios de programación... 247 9. Punteros, funciones virtuales y polimorfismo... 251 9.1 Introducción... 251 9.2 Punteros... 253 9.3 Punteros a objetos... 264 9.4 Puntero this... 269 9.5 Punteros a clases derivadas... 271 9.6 Funciones virtuales... 274 9.7 Funciones virtuales puras... 280 RESUMEN... 280 Preguntas de repaso... 282 Ejercicios de depuración... 282 Ejercicios de programación... 286 10. Operaciones de entrada/salida en consola... 289 10.1 Introducción... 289 10.2 Flujos (streams) en C++... 290
xi 10.3 Clases de flujos en C++... 291 10.4 Operaciones de E/S sin formato... 291 10.5 Operaciones con formato de E/S en la consola.... 300 10.6 Gestión de la salida con manipuladores.... 312 RESUMEN... 317 Preguntas de repaso... 318 Ejercicios de depuración... 319 Ejercicios de programación... 320 11. Utilización de archivos... 323 11.1 Introducción... 323 11.2 Clases para operaciones con flujos de archivos... 325 11.3 Apertura y cierre de un archivo... 325 11.4 Detección del fin-de-archivo... 334 11.5 Información adicional sobre open(): modos de archivo... 334 11.6 Punteros de archivo y su manipulación... 336 11.7 Operaciones secuenciales de entrada y salida... 338 11.8 Actualización de un archivo: Acceso directo... 344 11.9 Manejo de errores durante las operaciones con archivos... 348 11.10 Argumentos de línea de órdenes... 350 RESUMEN... 353 Preguntas de repaso... 355 Ejercicios de depuración... 356 Ejercicios de programación... 358 12. Plantillas... 359 12.1 Introducción... 359 12.2 Plantillas de clases.... 360 12.3 Plantillas de clases con varios parámetros.... 365 12.4 Plantillas de funciones.... 366 12.5 Plantillas de funciones con varios parámetros.... 371 12.6 Sobrecarga de funciones de plantillas... 372 12.7 Plantillas de funciones miembro.... 374 12.8 Argumentos genéricos para crear plantillas.... 375 RESUMEN... 376 Preguntas de repaso... 376 Ejercicios de depuración... 377 Ejercicios de programación... 379 13. Manejo de excepciones... 381 13.1 Introducción... 381 13.2 Conceptos básicos del manejo de excepciones... 382 13.3 Mecanismo de manejo de excepciones... 382 13.4 Mecanismo de lanzamiento... 387 13.5 Mecanismo de captura... 387
xii Contenido 13.6 Relanzamiento de una excepción... 392 13.7 Especificación de excepciones... 393 RESUMEN... 395 Preguntas de repaso... 396 Ejercicios de depuración... 397 Ejercicios de programación... 400 14. Introducción a la biblioteca de plantillas estándar... 403 14.1 Introducción... 403 14.2 Componentes de la STL... 404 14.3 Contenedores... 405 14.4 Algoritmos... 408 14.5 Iteradores... 411 14.6 Aplicación de las clases contenedor... 412 14.7 Objetos función... 423 RESUMEN... 425 Preguntas de repaso... 426 Ejercicios de depuración... 427 Ejercicios de programación... 429 15. Manipulación de cadenas... 431 15.1 Introducción... 431 15.2 Creación de objetos de tipo string... 433 15.3 Manipulación de objetos de tipo cadena... 435 15.4 Operaciones relacionales... 436 15.5 Características de string... 438 15.6 Acceso a los caracteres de las cadenas... 439 15.7 Comparación e intercambio... 441 RESUMEN... 443 Ejercicios de revisión... 444 Ejercicios de depuración... 445 Ejercicios de programación... 447 16. Nuevas características del ANSI C++ estándar... 449 16.1 Introducción... 449 16.2 Nuevos tipos de datos... 450 16.3 Nuevos operadores... 452 16.4 Implementación de clases... 454 16.5 Ámbito de espacios de nombres... 456 16.6 Operadores con palabras reservadas... 463 16.7 Nuevas palabras reservadas... 463 16.8 Nuevas cabeceras... 464 RESUMEN... 465 Preguntas de repaso... 466 Ejercicios de depuración... 467 Ejercicios de programación... 470
xiii 17. Desarrollo de sistemas orientado a objetos... 471 17.1 Introducción... 471 17.2 Paradigmas orientados a procedimientos... 472 17.3 Herramientas de desarrollo orientadas a procedimientos... 474 17.4 Paradigma orientado a objetos... 476 17.5 Notaciones y grafos orientados a objetos... 479 17.6 Pasos del análisis orientado a objetos... 479 17.7 Pasos del diseño orientado a objetos... 487 Organización de las jerarquías de clases... 488 17.8 Implementación... 493 17.9 Paradigma de prototipado... 494 17.10 Conclusiones... 494 RESUMEN... 496 Preguntas de repaso... 498 Apéndice A. Proyectos... 501 Apéndice B. Uso de Turbo C++... 521 Apéndice C. Ejecución de C++bajo Windows... 533 Apéndice D. Glosario de palabras clave de ANSI C++... 545 Apéndice E. Precedencia de operadores en C++... 551 Apéndice F. Puntos a recordar... 555 Apéndice G. Glosario de términos importantes de C++ y POO... 569 Apéndice H. Prueba de aptitud en C++... 581 Bibliografía... 615 Índice... 617