como programar c++ deitel 6edicion

1220
P. J. DEITEL H. M. DEITEL P. J. DEITEL H. M. DEITEL El CD incluye Microsoft ® Visual C++ ® Express Edition ®

Upload: tocohn06

Post on 06-Apr-2017

479 views

Category:

Education


35 download

TRANSCRIPT

  • P. J. DEITEL

    H. M. DEITEL

    P. J. DEITEL

    H. M. DEITEL

    INCL

    UYE CD-ROM

    El CD incluye

    Microsoft Visual C++

    Express Edition

    Una introduccin completa y autorizada del cdigo activo de DEITEL aC++, la programacin orientada a objetos (POO) y el diseo orientado

    a objetos (DOO) con UML 2

    C++ es uno de los lenguajes de programacin orientada a objetos ms populares.

    Esta nueva edicin del libro de texto sobre C++ ms utilizado en el mundo presentauna introduccin a la programacin de juegos con las bibliotecas Ogre. Proporciona,adems, una cobertura bastante completa de la programacin orientada a objetos enC++, incluyendo varios ejemplos prcticos integrados: la clase LibroCalificaciones,la clase Tiempo, la clase Empleado y el Sistema ATM opcional de DOO/UML 2.

    En los sitios Web www.deitel.com y www.pearsoneducacion.net/deitel encontrar losejemplos de cdigo del libro e informacin para profesores, estudiantes y profesiona-les. Asimismo, le recomendamos que d un vistazo a los Centros de Recursos Deitelsobre C++ en:

    www.deitel.com/resourcecenters.html

    El CD incluido en este libro contiene Microsoft Visual C++ Express Edition ymaterial adicional en espaol.

    Vistenos en:www.pearsoneducacion.net

    ISBN 978-970-26-1273-5

    CppHTP6e_FINAL_MECHANICAL.qxd 6/19/08 12:17 PM Page 1

  • C00_Preliminares_C++.indd iC00_Preliminares_C++.indd i 6/20/08 2:10:20 AM6/20/08 2:10:20 AM

  • C00_Preliminares_C++.indd xlC00_Preliminares_C++.indd xl 6/20/08 2:10:40 AM6/20/08 2:10:40 AM

  • Harvey M. DeitelDeitel & Associates, Inc.

    Paul J. DeitelDeitel & Associates, Inc.

    TRADUCCINAlfonso Vidal Romero Elizondo

    Ingeniero en Electrnica y ComunicacinInstituto Tecnolgico y de Estudios Superiores de Monterrey

    Campus Monterrey

    REVISIN TCNICA

    Jess Muoz BauzaDepartamento de Computacin

    Divisin de Ingeniera y ArquitecturaTecnolgico de MonterreyCampus Ciudad de Mxico

    Sergio Fuenlabrada VelzquezOskar A. Gmez C.

    Edna M. Miranda Ch.Mario Oviedo G.

    Adalberto Robles V.Mario A. Sesma M.

    Departamento de ComputacinUnidad Profesional Interdisciplinaria de Ingeniera

    y Ciencias Sociales y AdministrativasInstituto Politcnico Nacional

    C00_Preliminares_C++.indd iiiC00_Preliminares_C++.indd iii 6/20/08 2:10:21 AM6/20/08 2:10:21 AM

  • DEITEL, HARVEY M. Y PAUL J. DEITEL

    Cmo programar en C++. Sexta edicin

    PEARS ON EDUCACIN, Mxico 2008ISBN: 978-970-26-1273-5rea: Computacin

    Formato: 20 3 25.5 cm Pginas: 1112

    Authorized translation from the English language edition, entitled C++ How to program, 6th edition, by Deitel & Associates (Harvey & Paul) published by Pearson Education, Inc., publishing as Prentice Hall, Copyright 2008. All rights reserved. ISBN 0136152503

    Traduccin autorizada de la edicin en idioma ingls titulada C++ How to program, 6a edicin, por Deitel & Associates (Harvey & Paul), publicada por Pearson Education, Inc., publicada como Prentice Hall, Copyright 2008. Todos los derechos reservados.

    Esta edicin en espaol es la nica autorizada.

    Edicin en espaolEditor: Luis Miguel Cruz Castillo e-mail: [email protected] Editor de desarrollo: Bernardino Gutirrez HernndezSupervisor de produccin: Juan Jos Garca Guzmn

    Edicin en inglsVice President and Editorial Director, ECS: Marcia J. HortonAssociate Editor: Carole SnyderSupervisor/Editorial Assistant: Dolores MarsDirector of Team-Based Project Management: Vince OBrienSenior Managing Editor: Scott DisannoManaging Editor: Bob EngelhardtProduction Editor: Marta SamselA/V Production Editor: Greg DullesArt Studio: Artworks, York, PAArt Director: Kristine CarneyCover Design: Abbey S. Deitel, Harvey M. Deitel, Francesco Santalucia, Kristine CarneyInterior Design: Harvey M. Deitel, Kristine CarneyManufacturing Manager: Alexis Heydt-LongManufacturing Buyer: Lisa McDowellDirector of Marketing: Margaret Waples

    SEXTA EDICIN, 2008

    D.R. 2008 por Pearson Educacin de Mxico, S.A. de C.V. Atlacomulco 500-5o. piso

    Col. Industrial Atoto53519, Naucalpan de Jurez, Estado de Mxico

    Cmara Nacional de la Industria Editorial Mexicana. Reg. nm. 1031.

    Prentice Hall es una marca registrada de Pearson Educacin de Mxico, S.A. de C.V.

    Reservados todos los derechos. Ni la totalidad ni parte de esta publicacin pueden reproducirse, registrarse o transmitirse, por un sistema de recuperacin de informacin, en ninguna forma ni por ningn medio, sea electrnico, mecnico, fotoqumico, magntico o electroptico, por fotocopia, grabacin o cualquier otro, sin permiso previo por escrito del editor.

    El prstamo, alquiler o cualquier otra forma de cesin de uso de este ejemplar requerir tambin la autorizacin del editor o de sus representantes.

    ISBN 10: 970-26-1273-XISBN 13: 978-970-26-1273-5

    Impreso en Mxico. Printed in Mexico.1 2 3 4 5 6 7 8 9 0 - 11 10 09 08

    C00_Preliminares_C++.indd ivC00_Preliminares_C++.indd iv 6/20/08 2:10:21 AM6/20/08 2:10:21 AM

  • C00_Preliminares_C++.indd iiC00_Preliminares_C++.indd ii 6/20/08 2:10:21 AM6/20/08 2:10:21 AM

  • A las vctimas de la tragedia de Virginia Tech,sus familias, sus amigos y a toda la comunidad deVirginia Tech.

    Paul y Harvey Deitel

    C00_Preliminares_C++.indd vC00_Preliminares_C++.indd v 6/20/08 2:10:22 AM6/20/08 2:10:22 AM

  • C00_Preliminares_C++.indd viC00_Preliminares_C++.indd vi 6/20/08 2:10:23 AM6/20/08 2:10:23 AM

  • Prefacio xviii

    Antes de empezar xxxix

    1 Introduccin a las computadoras, Internet y World Wide Web 1

    1.1 Introduccin 21.2 Qu es una computadora? 31.3 Organizacin de una computadora 41.4 Los primeros sistemas operativos 41.5 Computacin personal, distribuida y cliente/servidor 51.6 Internet y World Wide Web 51.7 Web 2.0 61.8 Lenguajes mquina, lenguajes ensambladores y lenguajes de alto nivel 61.9 Historia de C y C++ 71.10 Biblioteca estndar de C++ 81.11 Historia de Java 91.12 FORTRAN, COBOL, Pascal y Ada 91.13 BASIC, Visual Basic, Visual C++, C# y .NET 101.14 Tendencia clave de software: la tecnologa de los objetos 101.15 Entorno de desarrollo tpico en C++ 111.16 Generalidades acerca de C++ y este libro 131.17 Prueba de una aplicacin en C++ 141.18 Tecnologas de software 191.19 Programacin de juegos con las bibliotecas Ogre 201.20 Futuro de C++: Bibliotecas Boost de cdigo fuente abierto, TR1 y C++0x 201.21 Ejemplo prctico de Ingeniera de Software: introduccin a la tecnologa de objetos y el UML 211.22 Repaso 251.23 Recursos Web 25

    2 Introduccin a la programacin en C++ 352.1 Introduccin 362.2 Su primer programa en C++: imprimir una lnea de texto 362.3 Modifi cacin de nuestro primer programa en C++ 392.4 Otro programa en C++: suma de enteros 402.5 Conceptos acerca de la memoria 442.6 Aritmtica 452.7 Toma de decisiones: operadores de igualdad y relacionales 472.8 (Opcional) Ejemplo prctico de Ingeniera de Software: cmo examinar la especifi cacin

    de requerimientos del ATM 522.9 Repaso 59

    Contenido

    C00_Preliminares_C++.indd viiC00_Preliminares_C++.indd vii 6/20/08 2:10:23 AM6/20/08 2:10:23 AM

  • viii Contenido

    3 Introduccin a las clases y los objetos 673.1 Introduccin 683.2 Clases, objetos, funciones miembro y miembros de datos 683.3 Generalidades acerca de los ejemplos del captulo 693.4 Defi nicin de una clase con una funcin miembro 703.5 Defi nicin de una funcin miembro con un parmetro 723.6 Miembros de datos, funciones establecer y funciones obtener 753.7 Inicializacin de objetos mediante constructores 813.8 Colocar una clase en un archivo separado para fi nes de reutilizacin 843.9 Separar la interfaz de la implementacin 873.10 Validacin de datos mediante funciones establecer 933.11 (Opcional) Ejemplo prctico de Ingeniera de Software: identifi cacin de las clases en la especifi cacin

    de requerimientos del ATM 973.12 Repaso 102

    4 Instrucciones de control: parte 1 1094.1 Introduccin 1104.2 Algoritmos 1104.3 Seudocdigo 1114.4 Estructuras de control 1124.5 Instruccin de seleccin if 1154.6 Instruccin de seleccin doble if...else 1164.7 Instruccin de repeticin while 1204.8 Cmo formular algoritmos: repeticin controlada por un contador 1214.9 Cmo formular algoritmos: repeticin controlada por un centinela 1264.10 Cmo formular algoritmos: instrucciones de control anidadas 1354.11 Operadores de asignacin 1394.12 Operadores de incremento y decremento 1394.13 (Opcional) Ejemplo prctico de Ingeniera de Software: identifi cacin de los atributos

    de las clases en el sistema ATM 1424.14 Repaso 146

    5 Instrucciones de control: parte 2 1595.1 Introduccin 1605.2 Fundamentos de la repeticin controlada por contador 1605.3 Instruccin de repeticin for 1625.4 Ejemplos acerca del uso de la instruccin for 1655.5 Instruccin de repeticin do...while 1695.6 Instruccin de seleccin mltiple switch 1715.7 Instrucciones break y continue 1795.8 Operadores lgicos 1805.9 Confusin entre los operadores de igualdad (==) y de asignacin (=) 1845.10 Resumen sobre programacin estructurada 1855.11 (Opcional) Ejemplo prctico de Ingeniera de Software: cmo identifi car los estados y actividades

    de los objetos en el sistema ATM 1895.12 Repaso 193

    6 Funciones y una introduccin a la recursividad 2036.1 Introduccin 2046.2 Componentes de los programas en C++ 2056.3 Funciones matemticas de la biblioteca 206

    C00_Preliminares_C++.indd viiiC00_Preliminares_C++.indd viii 6/20/08 2:10:23 AM6/20/08 2:10:23 AM

  • Contenido ix

    6.4 Defi niciones de funciones con varios parmetros 2076.5 Prototipos de funciones y coercin de argumentos 2116.6 Archivos de encabezado de la Biblioteca estndar de C++ 2136.7 Ejemplo prctico: generacin de nmeros aleatorios 2156.8 Ejemplo prctico: juego de probabilidad, introduccin a las enumeraciones 2206.9 Clases de almacenamiento 2236.10 Reglas de alcance 2256.11 La pila de llamadas a funciones y los registros de activacin 2286.12 Funciones con listas de parmetros vacas 2316.13 Funciones en lnea 2326.14 Referencias y parmetros de referencias 2336.15 Argumentos predeterminados 2376.16 Operador de resolucin de mbito unario 2396.17 Sobrecarga de funciones 2406.18 Plantillas de funciones 2436.19 Recursividad 2456.20 Ejemplo sobre el uso de la recursividad: serie de Fibonacci 2476.21 Comparacin entre recursividad e iteracin 2506.22 (Opcional) Ejemplo prctico de Ingeniera de Software: identifi cacin de las operaciones de las clases

    en el sistema ATM 2536.23 Repaso 258

    7 Arreglos y vectores 2777.1 Introduccin 2787.2 Arreglos 2797.3 Declaracin y creacin de arreglos 2807.4 Ejemplos acerca del uso de los arreglos 280 7.4.1 Declaracin de un arreglo y uso de un ciclo para inicializar los elementos del arreglo 281 7.4.2 Inicializacin de un arreglo en una declaracin mediante una lista inicializadora 281 7.4.3 Especifi cacin del tamao de un arreglo con una variable constante y establecimiento

    de los elementos de un arreglo con clculos 283 7.4.4 Suma de los elementos de un arreglo 285 7.4.5 Uso de grfi cos de barra para mostrar los datos de un arreglo en forma grfi ca 286 7.4.6 Uso de los elementos de un arreglo como contadores 287 7.4.7 Uso de arreglos para sintetizar los resultados de una encuesta 288 7.4.8 Uso de arreglos tipo carcter para almacenar y manipular cadenas 291 7.4.9 Arreglos locales estticos y arreglos locales automticos 2927.5 Paso de arreglos a funciones 2947.6 Ejemplo prctico: la clase LibroCalificaciones que usa un arreglo para almacenar

    las califi caciones 2987.7 Bsqueda de datos en arreglos mediante la bsqueda lineal 3047.8 Ordenamiento de arreglos mediante el ordenamiento por insercin 3057.9 Arreglos multidimensionales 3077.10 Ejemplo prctico: la clase LibroCalificaciones que usa un arreglo bidimensional 3107.11 Introduccin a la plantilla de clase vector de la Biblioteca estndar de C++ 3167.12 (Opcional) Ejemplo prctico de Ingeniera de Software: colaboracin entre los objetos en el sistema ATM 3207.13 Repaso 326

    8 Apuntadores y cadenas basadas en apuntadores 3418.1 Introduccin 3428.2 Declaraciones e inicializacin de variables apuntadores 3428.3 Operadores de apuntadores 3438.4 Paso de argumentos a funciones por referencia mediante apuntadores 346

    C00_Preliminares_C++.indd ixC00_Preliminares_C++.indd ix 6/20/08 2:10:24 AM6/20/08 2:10:24 AM

  • x Contenido

    8.5 Uso de const con apuntadores 3498.6 Ordenamiento por seleccin mediante el uso del paso por referencia 3558.7 Operador sizeof 3588.8 Expresiones y aritmtica de apuntadores 3608.9 Relacin entre apuntadores y arreglos 3628.10 Arreglos de apuntadores 3668.11 Ejemplo prctico: simulacin para barajar y repartir cartas 3678.12 Apuntadores a funciones 3728.13 Introduccin al procesamiento de cadenas basadas en apuntador 3768.14 Repaso 384

    9 Clases: un anlisis ms detallado, parte1 4079.1 Introduccin 4089.2 Ejemplo prctico con la clase Tiempo 4099.3 Alcance de las clases y acceso a los miembros de una clase 4149.4 Separar la interfaz de la implementacin 4169.5 Funciones de acceso y funciones utilitarias 4169.6 Ejemplo prctico de la clase Tiempo: constructores con argumentos predeterminados 4199.7 Destructores 4239.8 Cundo se hacen llamadas a los constructores y destructores 4249.9 Ejemplo prctico con la clase Tiempo: una trampa sutil (devolver una referencia a un miembro

    de datos private) 4279.10 Asignacin predeterminada a nivel de miembros 4299.11 (Opcional) Ejemplo prctico de Ingeniera de Software: inicio de la programacin de las clases

    del sistema ATM 4319.12 Repaso 437

    10 Clases: un anlisis ms detallado, parte 2 44310.1 Introduccin 44410.2 Objetos const (constantes) y funciones miembro const 44410.3 Composicin: objetos como miembros de clases 45210.4 Funciones friend y clases friend 45810.5 Uso del apuntador this 46110.6 Administracin dinmica de memoria con los operadores new y delete 46610.7 Miembros de clase static 46710.8 Abstraccin de datos y ocultamiento de informacin 472 10.8.1 Ejemplo: tipo de datos abstracto arreglo 473 10.8.2 Ejemplo: tipo de datos abstracto cadena 474 10.8.3 Ejemplo: tipo de datos abstracto cola 47410.9 Clases contenedoras e iteradores 47410.10 Clases proxy 47510.11 Repaso 477

    11 Sobrecarga de operadores: objetos String y Array 48311.1 Introduccin 48411.2 Fundamentos de la sobrecarga de operadores 48511.3 Restricciones acerca de la sobrecarga de operadores 48511.4 Las funciones de operadores como clase miembro vs. funciones globales 48711.5 Sobrecarga de los operadores de insercin de f lujo y extraccin de f lujo 48811.6 Sobrecarga de operadores unarios 491

    C00_Preliminares_C++.indd xC00_Preliminares_C++.indd x 6/20/08 2:10:24 AM6/20/08 2:10:24 AM

  • Contenido xi

    11.7 Sobrecarga de operadores binarios 49111.8 Ejemplo prctico: la clase Array 49211.9 Conversin entre tipos 50211.10 Ejemplo prctico: la clase String 50211.11 Sobrecarga de ++ y 51311.12 Ejemplo prctico: una clase Fecha 51411.13 La clase string de la Biblioteca estndar 51811.14 Constructores explicit 52111.15 Repaso 524

    12 Programacin orientada a objetos: herencia 53512.1 Introduccin 53612.2 Clases base y clases derivadas 53712.3 Miembros protected 53912.4 Relacin entre las clases base y las clases derivadas 539 12.4.1 Creacin y uso de una clase EmpleadoPorComision 540 12.4.2 Creacin de una clase EmpleadoBaseMasComision sin usar la herencia 544 12.4.3 Creacin de una jerarqua de herencia EmpleadoPorComision-Empleado-BaseMasComision 549 12.4.4 La jerarqua de herencia EmpleadoPorComision-EmpleadoBaseMasComision

    mediante el uso de datos protected 553 12.4.5 La jerarqua de herencia EmpleadoPorComision-EmpleadoBaseMasComision

    mediante el uso de datos private 55912.5 Los constructores y destructores en las clases derivadas 56612.6 Herencia public, protected y private 57312.7 Ingeniera de software mediante la herencia 57312.8 Repaso 574

    13 Programacin orientada a objetos: polimorfi smo 57913.1 Introduccin 58013.2 Ejemplos de polimorfi smo 58113.3 Relaciones entre los objetos en una jerarqua de herencia 582 13.3.1 Invocacin de funciones de la clase base desde objetos de una clase derivada 583 13.3.2 Cmo orientar los apuntadores de una clase derivada a objetos de la clase base 589 13.3.3 Llamadas a funciones miembro de una clase derivada a travs de apuntadores de la clase base 590 13.3.4 Funciones virtuales 591 13.3.5 Resumen de las asignaciones permitidas entre objetos y apuntadores de la clase base

    y de la clase derivada 59613.4 Tipos de campos e instrucciones switch 59713.5 Clases abstractas y funciones virtual puras 59713.6 Ejemplo prctico: sistema de nmina mediante el uso de polimorfi smo 599 13.6.1 Creacin de la clase base abstracta Empleado 600 13.6.2 Creacin de la clase derivada concreta EmpleadoAsalariado 603 13.6.3 Creacin de la clase derivada concreta EmpleadoPorHoras 605 13.6.4 Creacin de la clase derivada concreta EmpleadoPorComision 607 13.6.5 Creacin de la clase derivada concreta indirecta EmpleadoBaseMasComision 608 13.6.6 Demostracin del procesamiento polimrfi co 61013.7 (Opcional) Polimorfi smo, funciones virtuales y vinculacin dinmica detrs de las cmaras 61413.8 Ejemplo prctico: sistema de nmina mediante el uso de polimorfi smo e informacin de tipos en tiempo

    de ejecucin con conversin descendente, dynamic_cast, typeid y type_info 61713.9 Destructores virtuales 62013.10 (Opcional) Ejemplo prctico de Ingeniera de Software: incorporacin de la herencia en el sistema ATM 62013.11 Repaso 627

    C00_Preliminares_C++.indd xiC00_Preliminares_C++.indd xi 6/20/08 2:10:24 AM6/20/08 2:10:24 AM

  • xii Contenido

    14 Plantillas 63114.1 Introduccin 63214.2 Plantillas de funciones 63214.3 Sobrecarga de plantillas de funciones 63514.4 Plantillas de clases 63614.5 Parmetros sin tipo y tipos predeterminados para las plantillas de clases 64114.6 Notas acerca de las plantillas y la herencia 64214.7 Notas acerca de las plantillas y funciones friend 64214.8 Notas acerca de las plantillas y miembros static 64314.9 Repaso 643

    15 Entrada y salida de fl ujos 64815.1 Introduccin 64915.2 Flujos 650 15.2.1 Comparacin entre f lujos clsicos y f lujos estndar 650 15.2.2 Archivos de encabezado de la biblioteca iostream 651 15.2.3 Clases y objetos de entrada/salida de f lujos 65115.3 Salida de f lujos 653 15.3.1 Salida de variables char * 653 15.3.2 Salida de caracteres mediante la funcin miembro put 65315.4 Entrada de f lujos 654 15.4.1 Funciones miembro get y getline 654 15.4.2 Funciones miembro peek, putback e ignore de istream 657 15.4.3 E/S con seguridad de tipos 65715.5 E/S sin formato mediante el uso de read, write y gcount 65715.6 Introduccin a los manipuladores de f lujos 658 15.6.1 Base de f lujos integrales: dec, oct, hex y setbase 658 15.6.2 Precisin de punto f lotante (precision, setprecision) 659 15.6.3 Anchura de campos (width, setw) 660 15.6.4 Manipuladores de f lujos de salida defi nidos por el usuario 66215.7 Estados de formato de f lujos y manipuladores de f lujos 663 15.7.1 Ceros a la derecha y puntos decimales (showpoint) 663 15.7.2 Justifi cacin (left, right e internal) 664 15.7.3 Relleno de caracteres (fill, setfill) 665 15.7.4 Base de f lujos integrales (dec, oct, hex, showbase) 667 15.7.5 Nmeros de punto f lotante: notacin cientfi ca y fi ja (scientific, fixed) 667 15.7.6 Control de maysculas/minsculas (uppercase) 668 15.7.7 Especifi cacin de formato booleano (boolalpha) 669 15.7.8 Establecer y restablecer el estado de formato mediante la funcin miembro flags 67015.8 Estados de error de los f lujos 67115.9 Enlazar un f lujo de salida a un f lujo de entrada 67315.10 Repaso 673

    16 Manejo de excepciones 68216.1 Introduccin 68316.2 Generalidades acerca del manejo de excepciones 68416.3 Ejemplo: manejo de un intento de dividir entre cero 68416.4 Cundo utilizar el manejo de excepciones 68916.5 Volver a lanzar una excepcin 69016.6 Especifi caciones de excepciones 69116.7 Procesamiento de excepciones inesperadas 69216.8 Limpieza de la pila 69216.9 Constructores, destructores y manejo de excepciones 694

    C00_Preliminares_C++.indd xiiC00_Preliminares_C++.indd xii 6/20/08 2:10:25 AM6/20/08 2:10:25 AM

  • Contenido xiii

    16.10 Excepciones y herencia 69416.11 Procesamiento de las fallas de new 69416.12 La clase auto_ptr y la asignacin dinmica de memoria 69816.13 Jerarqua de excepciones de la Biblioteca estndar 70016.14 Otras tcnicas para manejar errores 70116.15 Repaso 702

    17 Procesamiento de archivos 70817.1 Introduccin 70917.2 Jerarqua de datos 70917.3 Archivos y f lujos 71117.4 Creacin de un archivo secuencial 71217.5 Cmo leer datos de un archivo secuencial 71517.6 Actualizacin de archivos secuenciales 72017.7 Archivos de acceso aleatorio 72117.8 Creacin de un archivo de acceso aleatorio 72117.9 Cmo escribir datos al azar a un archivo de acceso aleatorio 72617.10 Cmo leer de un archivo de acceso aleatorio en forma secuencial 72817.11 Ejemplo prctico: un programa para procesar transacciones 73017.12 Generalidades acerca de la serializacin de objetos 73517.13 Repaso 736

    18 La clase string y el procesamiento de fl ujos de cadena 74518.1 Introduccin 74618.2 Asignacin y concatenacin de objetos string 74718.3 Comparacin de objetos string 74918.4 Subcadenas 75118.5 Intercambio de objetos string 75218.6 Caractersticas de los objetos string 75218.7 Bsqueda de subcadenas y caracteres en un objeto string 75418.8 Reemplazo de caracteres en un objeto string 75618.9 Insercin de caracteres en un objeto string 75818.10 Conversin a cadenas estilo C 75818.11 Iteradores 76018.12 Procesamiento de f lujos de cadena 76118.13 Repaso 764

    19 Bsqueda y ordenamiento 76919.1 Introduccin 77019.2 Algoritmos de bsqueda 770 19.2.1 Efi ciencia de la bsqueda lineal 770 19.2.2 Bsqueda binaria 77219.3 Algoritmos de ordenamiento 776 19.3.1 Efi ciencia del ordenamiento por seleccin 776 19.3.2 Efi ciencia del ordenamiento por insercin 777 19.3.3 Ordenamiento por combinacin (una implementacin recursiva) 77719.4 Repaso 783

    20 Estructuras de datos 78820.1 Introduccin 78920.2 Clases autorreferenciadas 790

    C00_Preliminares_C++.indd xiiiC00_Preliminares_C++.indd xiii 6/20/08 2:10:25 AM6/20/08 2:10:25 AM

  • xiv Contenido

    20.3 Asignacin dinmica de memoria y estructuras de datos 79020.4 Listas enlazadas 79120.5 Pilas 80420.6 Colas 80720.7 rboles 81020.8 Repaso 818 Seccin especial: construya su propio compilador 826

    21 Bits, caracteres, cadenas estilo C y estructuras 83721.1 Introduccin 83821.2 Defi niciones de estructuras 83821.3 Inicializacin de estructuras 84021.4 Uso de estructuras con funciones 84021.5 typedef 84021.6 Ejemplo: simulacin para barajar y repartir cartas de alto rendimiento 84121.7 Operadores a nivel de bits 84321.8 Campos de bits 85121.9 Biblioteca de manejo de caracteres 85421.10 Funciones de conversin de cadenas basadas en apuntador 85921.11 Funciones de bsqueda de la biblioteca de manejo de cadenas basadas en apuntador 86321.12 Funciones de memoria de la biblioteca de manejo de cadenas basadas en apuntador 86721.13 Repaso 871

    22 Biblioteca de plantillas estndar (STL) 88122.1 Introduccin a la Biblioteca de plantillas estndar (STL) 882 22.1.1 Introduccin a los contenedores 884 22.1.2 Introduccin a los iteradores 887 22.1.3 Introduccin a los algoritmos 89222.2 Contenedores de secuencia 893 22.2.1 Contenedor de secuencia vector 894 22.2.2 Contenedor de secuencia list 900 22.2.3 Contenedor de secuencia deque 90322.3 Contenedores asociativos 904 22.3.1 Contenedor asociativo multiset 904 22.3.2 Contenedor asociativo set 907 22.3.3 Contenedor asociativo multimap 908 22.3.4 Contenedor asociativo map 91022.4 Adaptadores de contenedores 911 22.4.1 Adaptador stack 911 22.4.2 Adaptador queue 913 22.4.3 Adaptador priority_queue 91422.5 Algoritmos 915 22.5.1 fill, fill_n, generate y generate_n 916 22.5.2 equal, mismatch y lexicographical_compare 917 22.5.3 remove, remove_if, remove_copy y remove_copy_if 919 22.5.4 replace, replace_if, replace_copy y replace_copy_if 921 22.5.5 Algoritmos matemticos 923 22.5.6 Algoritmos bsicos de bsqueda y ordenamiento 926 22.5.7 swap, iter_swap y swap_ranges 928 22.5.8 copy_backward, merge, unique y reverse 929 22.5.9 inplace_merge, unique_copy y reverse_copy 931 22.5.10 Operaciones set 933 22.5.11 lower_bound, upper_bound y equal_range 935 22.5.12 Ordenamiento de montn (heapsort) 937

    C00_Preliminares_C++.indd xivC00_Preliminares_C++.indd xiv 6/20/08 2:10:26 AM6/20/08 2:10:26 AM

  • Contenido xv

    22.5.13 min y max 939 22.5.14 Algoritmos de la STL que no se cubren en este captulo 94022.6 La clase bitset 94122.7 Objetos de funciones 94422.8 Conclusin 94722.9 Recursos Web de la STL 947

    23 Programacin de juegos con Ogre 95523.1 Introduccin 95623.2 Instalacin de Ogre, OgreAL y OpenAL 95623.3 Fundamentos de la programacin de juegos 95623.4 El juego de Pong: recorrido a travs del cdigo 959 23.4.1 Inicializacin de Ogre 959 23.4.2 Creacin de una escena 967 23.4.3 Agregar elementos a la escena 968 23.4.4 Animacin y temporizadores 978 23.4.5 Entrada del usuario 979 23.4.6 Deteccin de colisiones 980 23.4.7 Sonido 984 23.4.8 Recursos 985 23.4.9 Controlador de Pong 98523.5 Repaso 98623.6 Recursos Web de Ogre 987

    24 Bibliotecas Boost, Reporte tcnico 1 y C++0x 99524.1 Introduccin 99624.2 Centros de recursos de C++ (y relacionados) en lnea de Deitel 99624.3 Bibliotecas Boost 99624.4 Cmo agregar una nueva biblioteca a Boost 99724.5 Instalacin de las Bibliotecas Boost 99724.6 Las Bibliotecas Boost en el Reporte tcnico 1 (TR1) 99724.7 Uso de expresiones regulares con la biblioteca Boost.Regex 1000 24.7.1 Ejemplo de una expresin regular 1000 24.7.2 Cmo validar la entrada del usuario mediante expresiones regulares 1002 24.7.3 Cmo reemplazar y dividir cadenas 100524.8 Apuntadores inteligentes con Boost.Smart_ptr 1007 24.8.1 Uso de shared_ptr y conteo de referencias 1007 24.8.2 weak_ptr: observador de shared_ptr 101124.9 Reporte tcnico 1 101624.10 C++0x 101724.11 Cambios en el lenguaje bsico 101724.12 Repaso 1021

    25 Otros temas 102825.1 Introduccin 102925.2 Operador const_cast 102925.3 Espacios de nombres 103025.4 Palabras clave de operadores 103425.5 Miembros de clases mutable 103625.6 Apuntadores a miembros de clases (.* y ->*) 103725.7 Herencia mltiple 103925.8 Herencia mltiple y clases base virtual 104325.9 Repaso 1047

    C00_Preliminares_C++.indd xvC00_Preliminares_C++.indd xv 6/20/08 2:10:26 AM6/20/08 2:10:26 AM

  • xvi Contenido

    A Tabla de precedencia de operadores y asociatividad 1051A.1 Precedencia de operadores 1051

    B Conjunto de caracteres ASCII 1053

    C Tipos fundamentales 1054

    D Sistemas numricos 1056D.1 Introduccin 1057D.2 Abreviatura de los nmeros binarios como nmeros octales y hexadecimales 1059D.3 Conversin de nmeros octales y hexadecimales a binarios 1060D.4 Conversin de un nmero binario, octal o hexadecimal a decimal 1061D.5 Conversin de un nmero decimal a binario, octal o hexadecimal 1061D.6 Nmeros binarios negativos: notacin de complemento a dos 1062

    E Temas sobre cdigo heredado de C 1067E.1 Introduccin 1068E.2 Redireccin de la entrada/salida en sistemas UNIX/LINUX/Mac OS X y Windows 1068E.3 Listas de argumentos de longitud variable 1069E.4 Uso de argumentos de lnea de comandos 1071E.5 Observaciones acerca de la compilacin de programas con varios archivos de cdigo fuente 1072E.6 Terminacin de los programas con exit y atexit 1074E.7 Califi cador de tipo volatile 1075E.8 Sufi jos para constantes enteras y de punto f lotante 1075E.9 Manejo de seales 1076E.10 Asignacin dinmica de memoria con calloc y realloc 1078E.11 Bifurcacin incondicional: goto 1078E.12 Uniones 1080E.13 Especifi caciones de vinculacin 1082E.14 Repaso 1083

    F Preprocesador 1088F.1 Introduccin 1089F.2 La directiva del procesador #include 1089F.3 La directiva del preprocesador #define: constantes simblicas 1090F.4 La directiva del preprocesador #define: macros 1090F.5 Compilacin condicional 1092F.6 Las directivas del preprocesador #error y #pragma 1092F.7 Los operadores # y ## 1093F.8 Constantes simblicas predefi nidas 1093F.9 Aserciones 1093F.10 Repaso 1094

    C00_Preliminares_C++.indd xviC00_Preliminares_C++.indd xvi 6/20/08 2:10:27 AM6/20/08 2:10:27 AM

  • Contenido xvii

    G Cdigo del caso de estudio del ATM 1098G.1 Implementacin del caso de estudio del ATM 1098G.2 La clase ATM 1099G.3 La clase Pantalla 1104G.4 La clase Teclado 1105G.5 La clase DispensadorEfectivo 1106G.6 La clase RanuraDeposito 1108G.7 La clase Cuenta 1109G.8 La clase BaseDatosBanco 1111G.9 La clase Transaccion 1114G.10 La clase SolicitudSaldo 1115G.11 La clase Retiro 1117G.12 La clase Deposito 1121G.13 El programa de prueba EjemploPracticoATM.cpp 1124G.14 Repaso 1124

    H UML 2: tipos de diagramas adicionales 1125H.1 Introduccin 1125H.2 Tipos de diagramas adicionales 1125

    I Uso del depurador de Visual Studio 1127I.1 Introduccin 1128I.2 Los puntos de interrupcin y el comando Continuar 1128I.3 Las ventanas Variables locales e Inspeccin 1132I.4 Control de la ejecucin mediante los comandos Paso a paso por instrucciones,

    Paso a paso por procedimientos, Paso a paso para salir y Continuar 1135I.5 La ventana Automtico 1137I.6 Repaso 1138

    J Uso del depurador de GNU C++ 1141J.1 Introduccin 1142J.2 Los puntos de interrupcin y los comandos run, stop, continue y print 1142J.3 Los comandos print y set 1147J.4 Control de la ejecucin mediante los comandos step, finish y next 1149J.5 El comando watch 1151J.6 Repaso 1153

    Bibliografa 1157

    ndice 1163

    C00_Preliminares_C++.indd xviiC00_Preliminares_C++.indd xvii 6/20/08 2:10:27 AM6/20/08 2:10:27 AM

  • El principal mrito del lenguaje es la claridadGalen

    Bienvenido a C++ y Cmo programar en C++, sexta edicin! En Deitel & Associates escribimos libros de texto sobre lenguajes de programacin y libros de nivel profesional para Prentice Hall, impartimos capacitacin a empresas en todo el mundo y desarrollamos negocios en Internet con Web 2.0. Este libro ref leja los cambios importantes en el lenguaje C++ y en las formas preferidas de impartir y aprender programacin. Se han realizado ajustes considerables en todos los captulos. La seccin Recorrido a travs del libro del prefacio proporciona a los instructores, estudiantes y profesionales una idea del tipo de cobertura que ofrece este texto sobre C++ y la programacin orientada a objetos.

    Caractersticas nuevas y mejoradasHe aqu una lista de las actualizaciones que hemos realizado a la sexta edicin de Cmo programar en C++:

    Programacin de juegos. Hemos agregado un nuevo captulo sobre la programacin de juegos. Los ingresos de la industria de juegos de computadora son ya mayores que los de la industria cinematogrfi ca, con lo cual se crean muchas oportunidades para los estudiantes interesados en carreras relacionadas con la programacin de juegos. El captulo 23, Programacin de juegos con Ogre, introduce la programacin de juegos y los grfi cos con el motor de grfi cos Ogre 3D, de cdigo fuente abierto. Hablaremos sobre las cuestiones bsicas relacio-nadas con la programacin de juegos. Despus le mostraremos cmo utilizar Ogre para crear un juego simple con una mecnica de juego similar al clsico videojuego Pong, desarrollado originalmente por Atari en 1972. Demostraremos cmo crear una escena con grfi cos 3D a colores, cmo animar los objetos mviles de manera uniforme, cmo usar los temporizadores para controlar la velocidad de animacin, detectar colisiones entre objetos, agregar sonido, aceptar la entrada mediante el teclado y mostrar salida de texto.

    El futuro de C++. Hemos agregado el captulo 24, en el que se considera el futuro de C++; presentamos las Bibliotecas Boost de C++, el Informe tcnico 1 (TR1) y C++0x. Las bibliotecas gratuitas Boost de cdigo fuente abierto son creadas por miembros de la comunidad de C++. El Informe tcnico 1 describe los cam-bios propuestos a la Biblioteca estndar de C++, muchos de los cuales estn basados en las bibliotecas Boost actuales. El Comit de estndares de C++ est revisando el Estndar de C++. Los principales objetivos para el nuevo estndar son facilitar el aprendizaje de este lenguaje, mejorar las herramientas para construir bibliotecas e incrementar su compatibilidad con el lenguaje C. El ltimo estndar se public en 1998. El trabajo sobre el nuevo estndar, que se conoce actualmente como C++0x, empez en 2003 y es probable que se publique en 2009. Incluir cambios al lenguaje del ncleo y, muy probablemente, a muchas de las bibliotecas en el TR1. Aqu veremos las generalidades acerca de las bibliotecas del TR1 y proporcionaremos cdigos de ejemplo para las de expresiones regulares y apuntadores inteligentes. Las expresiones regulares se utilizan para relacio-nar patrones de caracteres especfi cos en el texto. Pueden usarse para validar los datos, para asegurar que se encuentren en un formato especfi co, para sustituir partes de una cadena con otra o para dividirla. Muchos de los errores comunes en el cdigo de C y C++ se relacionan con los apuntadores, una poderosa herramien-ta de programacin que estudiaremos en el captulo 8, Apuntadores y cadenas basadas en apuntadores. Los apuntadores inteligentes nos ayudan a evitar errores al proporcionar una funcionalidad adicional a los apun-tadores estndar.

    Importantes revisiones de contenido. Todos los captulos se han actualizado y mejorado de manera conside-rable. Ajustamos la claridad y precisin de la escritura, as como el uso de la terminologa de C++, de confor-midad con el documento del estndar ISO/IEC de C++ que defi ne el lenguaje.

    Prefacio

    C00_Preliminares_C++.indd xviiiC00_Preliminares_C++.indd xviii 6/20/08 2:10:28 AM6/20/08 2:10:28 AM

  • Introduccin temprana a las metodologas de clases y objetos. Presentamos a los estudiantes los conceptos bsicos y la terminologa de la tecnologa de objetos en el captulo 1, y empezamos a desarrollar clases reutiliza-bles personalizadas y objetos en el captulo 3. Este libro presenta la programacin orientada a objetos, segn sea apropiado, desde el principio y a lo largo de este libro. El anlisis temprano sobre los objetos y las clases hace que los estudiantes piensen en objetos de inmediato, y que dominen estos conceptos de una manera ms com-pleta. La programacin orientada a objetos no es trivial de ningn modo, pero es divertido escribir programas orientados a objetos, y los estudiantes pueden ver resultados de inmediato.

    Ejemplos prcticos integrados. Proporcionamos varios ejemplos prcticos que abarcan varias secciones y captulos, que con frecuencia se basan en una clase presentada en una seccin anterior del libro, para demostrar los nuevos conceptos de programacin que se presentan ms adelante en el libro. Estos ejemplos prcticos inclu-yen el desarrollo de la clase LibroCalificaciones en los captulos 3 a 7, la clase Tiempo en varias secciones de los captulos 9 y 10, la clase Empleado en los captulos 12 y 13, y el ejemplo prctico opcional de DOO/UML del ATM en los captulos 1 a 7, 9, 13 y en el apndice G.

    Ejemplo prctico integrado de LibroCalificaciones. El ejemplo prctico LibroCalificaciones refuer-za nuestra primera presentacin de las clases. Utiliza clases y objetos en los captulos 3 a 7 para construir en forma incremental una clase llamada LibroCalificaciones, la cual representa el libro de califi caciones de un instructor y realiza varios clculos con base en los resultados obtenidos por los estudiantes, como calcular la califi cacin promedio, buscar las califi caciones mxima y mnima e imprimir un grfi co de barras.

    Lenguaje Unifi cado de Modelado 2 (UML 2). El Lenguaje Unifi cado de Modelado (UML) se ha conver-tido en el lenguaje de modelado grfi co preferido por los diseadores de sistemas orientados a objetos. Todos los diagramas de UML en el libro cumplen con la especifi cacin de UML 2. Usamos los diagramas de clases de UML para representar en forma visual las clases y sus relaciones de herencia, y utilizamos los diagramas de actividad de UML para demostrar el f lujo de control en cada una de las instrucciones de control de C++. En el ejemplo prctico de DOO/UML del ATM, hacemos un uso especialmente intensivo de UML.

    Ejemplo prctico opcional de DOO/UML del ATM. El ejemplo prctico opcional de DOO/UML del cajero automtico (ATM) en las secciones tituladas Ejemplo prctico de Ingeniera de Software de los captulos 1 a 7, 9 y 13, es apropiado para un primer y segundo curso de programacin. Las nueve secciones del ejemplo prctico presentan una introduccin cuidadosamente planeada al diseo orientado a objetos, mediante el uso de UML. Presentamos un subconjunto conciso y simplifi cado de UML 2, para despus guiarlo a travs de su primera expe-riencia de diseo, elaborada para el diseador/programador orientado a objetos principiante. Nuestra meta aqu es ayudar a los estudiantes a desarrollar un diseo orientado a objetos para complementar los conceptos que sobre este tema empezarn a ver en el captulo 1, y que implementarn en el captulo 3. El ejemplo prctico fue revisado por un distinguido equipo de profesores y profesionales de la industria relacionados con el DOO/UML. El ejem-plo prctico no es un ejercicio: es una experiencia de aprendizaje de principio a fi n, cuidadosamente diseada, que concluye con un recorrido detallado a travs de la implementacin del cdigo completo de 877 lneas en C++. Ms adelante en este prefacio, veremos una descripcin detallada de las nueve secciones de este ejemplo prctico.

    Proceso de compilacin y vinculacin para los programas con varios archivos de cdigo fuente. En el captulo 3 se incluye un diagrama detallado y un anlisis acerca del proceso de compilacin y vinculacin que produce una aplicacin ejecutable.

    Explicacin de la pila de llamadas a funciones. En el captulo 6 proporcionamos un anlisis detallado (con ilustraciones) acerca de la pila de llamadas a funciones y los registros de activacin, para explicar cmo C++ puede llevar el registro acerca de cul funcin se est ejecutando en un momento dado, cmo se mantienen en memoria las variables automticas de las funciones, y cmo sabe una funcin a dnde regresar una vez que termina de ejecutarse.

    Las clases string y vector de la Biblioteca estndar de C++. Las clases string y vector se utilizan para hacer que los primeros ejemplos sean ms orientados a objetos.

    La clase string. Utilizamos la clase string en vez de las cadenas char * basadas en apuntadores al estilo C para la mayora de las manipulaciones de cadenas a lo largo de este libro. En los captulos 8, 10, 11 y 21 seguimos incluyendo discusiones acerca de las cadenas char * para que los estudiantes puedan practicar con las manipulaciones de apuntadores, para ilustrar la asignacin dinmica de memoria con new y delete, para construir nuestra propia clase String y para preparar a los estudiantes con el fi n de trabajar con las cadenas char * en el cdigo heredado de C y C++.

    Caractersticas nuevas y mejoradas xix

    C00_Preliminares_C++.indd xixC00_Preliminares_C++.indd xix 6/20/08 2:10:28 AM6/20/08 2:10:28 AM

  • xx Prefacio

    La plantilla de clase vector. A lo largo del libro, utilizamos la plantilla de clase vector en vez de las mani-pulaciones de arreglos basadas en apuntadores al estilo C. Sin embargo, primero hablamos sobre los arreglos basados en apuntadores estilo C en el captulo 7, con el fi n de preparar a los estudiantes para trabajar con el cdigo heredado de C y C++, y para usarlos como base para construir nuestra propia clase Arreglo personali-zada en el captulo 11, Sobrecarga de operadores: objetos String y Array.

    Tratamiento optimizado de la herencia y el polimorfi smo. Los captulos 12 y 13 se han optimizado cui-dadosamente mediante el uso de una jerarqua de clases Empleado, para que el tratamiento de la herencia y el polimorfi smo sea un proceso ms claro y accesible para los estudiantes que incursionen por primera vez en la POO.

    Anlisis e ilustracin acerca del funcionamiento interno del polimorfi smo. El captulo 13 contiene un diagrama detallado y una explicacin acerca de cmo puede C++ implementar internamente el polimorfi smo, las funciones virtual y la vinculacin dinmica. Esto proporciona a los estudiantes una slida comprensin acerca de cmo funcionan realmente estas herramientas. Y lo que es ms importante, ayuda a los estudiantes a apreciar la sobrecarga impuesta por el polimorfi smo, en trminos de consumo adicional de memoria y tiempo del procesador. Esto ayuda a los estudiantes a determinar cundo deben usar el polimorfi smo, y cundo deben evitarlo.

    Biblioteca de plantillas estndar (STL). ste podra ser uno de los temas ms importantes del libro, en trminos de la apreciacin que tenga sobre la reutilizacin de software. La STL defi ne poderosos componen-tes reutilizables, basados en plantillas, que implementan muchas estructuras de datos y algoritmos comunes utilizados para procesar esas estructuras de datos. En el captulo 22 se presenta la STL y se describen sus tres componentes clave: contenedores, iteradores y algoritmos. Aqu mostramos que el uso de los componentes de la STL nos proporciona un enorme poder expresivo, lo cual a menudo reduce muchas lneas de cdigo a una sola instruccin.

    Conformidad con el estndar ISO/IEC de C++. Hemos auditado nuestra presentacin para compararla con el documento ms reciente del estndar ISO/IEC de C++, en cuanto a su grado de exactitud y precisin. [Nota: si necesita detalles tcnicos adicionales sobre C++, tal vez sea conveniente que adquiera el documento del estndar de C++. en webstore.ansi.org/ansidocstore/default.asp (nmero de documento INCITS/ISO/IEC 14882-2003)].

    Apndices del depurador. Incluimos dos apndices sobre el uso del depurador: apndice I, Uso del Depurador de Visual Studio, y el apndice J, Uso del Depurador de GNU C++.

    Prueba del cdigo en varias plataformas. Probamos los ejemplos de cdigo en varias plataformas populares para C++. En su mayor parte, todos los ejemplos del libro se pueden portar con facilidad a todos los compila-dores populares que cumplen con el estndar.

    Errores y advertencias mostrados para varias plataformas. Para los programas que contienen errores inten-cionales para ilustrar un concepto clave, mostramos los mensajes de error que se producen en varias plataformas populares.

    Todo esto ha sido cuidadosamente revisado por distinguidos profesores y desarrolladores de la industria que trabajaron con nosotros en la quinta y sexta edicin de Cmo programar en C++. Creemos que este libro y sus materiales de apoyo proporcionarn a los estudiantes y profesionales una experiencia educativa informativa, interesante, retadora y divertida en relacin con C++. Este libro incluye una extensa suite de materiales auxiliares que ayudan a los instructores a maximizar la experiencia de aprendizaje de sus estudiantes. A medida que lea este libro, si tiene preguntas, no dude en enviar un correo electrnico a [email protected]; le responderemos lo ms pronto posible. Para obtener actualizaciones en relacin con este libro y con todo el software de soporte para C++, as como para ver las noticias ms recientes acerca de todas las publicaciones y servicios Deitel, visite www.deitel.com. Suscrbase en www.deitel.com/newsletter/subscribe.html para recibir el boletn de noti-cias electrnico Deitel Buzz Online, y d un vistazo a nuestra creciente lista de Centros de Recursos relacionados en www.deitel.com/ResourceCenters.html. Cada semana anunciaremos nuestros Centros de Recursos ms recientes en el boletn de noticias. No dude en comentarnos acerca de otros Centros de Recursos que desee ver incluidos.

    Mtodo de enseanzaCmo programar en C++, sexta edicin, contiene una extensa coleccin de ejemplos. El libro se concentra en los principios de la buena ingeniera de software, haciendo hincapi en la claridad de los programas. Enseamos mediante ejemplos.

    C00_Preliminares_C++.indd xxC00_Preliminares_C++.indd xx 6/20/08 2:10:29 AM6/20/08 2:10:29 AM

  • Somos educadores que presentamos temas de vanguardia en salones de clases de la industria alrededor de todo el mundo. El Dr. Harvey M. Deitel tiene 20 aos de experiencia en la enseanza a nivel universitario y 18 en la industria. Paul Deitel tiene 16 aos de experiencia en la enseanza dentro de la industria. Los Deitel han impartido cursos en todos los niveles, a clientes gubernamentales, industriales, militares y acadmicos.

    Mtodo del cdigo activo. Cmo programar en C++, sexta edicin, est lleno de ejemplos de cdigo activo; esto signifi ca que cada nuevo concepto se presenta en el contexto de una aplicacin en C++ completa y funcional, que es seguido inme-diatamente por una o ms ejecuciones actuales, que muestran la entrada y salida del programa. Este estilo ejemplifi ca la manera en que enseamos y escribimos acerca de la programacin; a esto le llamamos mtodo de cdigo activo.

    Resaltado de cdigo. Colocamos rectngulos de color gris alrededor de los segmentos de cdigo clave en cada programa.

    Uso de tipos de letra para dar nfasis. Colocamos los trminos clave en negritas para facilitar su referencia. Enfatiza-mos los componentes en pantalla con el tipo de letra Helvtica en negritas (por ejemplo, el men Archivo) y enfatizamos el texto del programa con el tipo de letra Lucida (por ejemplo, int x = 5).

    Acceso Web. Todos los ejemplos de cdigo fuente (en ingls) para Cmo programar en C++, sexta edicin, estn disponi-bles para su descarga en:

    www.deitel.com/books/cpphtp6

    El registro en el sitio es un proceso fcil y rpido. Descargue todos los ejemplos a medida que lea los correspondientes anlisis en el libro de texto, despus ejecute cada programa. Realizar modifi caciones a los ejemplos y ver los efectos de esos cambios es una excelente manera de mejorar su experiencia de aprendizaje en C++.

    Objetivos. Cada captulo comienza con una declaracin de objetivos. Esto le permite saber qu es lo que debe esperar y le brinda la oportunidad, despus de leer el captulo, de determinar si ha cumplido con ellos.

    Frases. Despus de los objetivos de aprendizaje aparecen una o ms frases. Algunas son graciosas, otras fi losfi cas; y las dems ofrecen ideas interesantes. Esperamos que disfrute relacionando las frases con el material del captulo.

    Plan general. El plan general de cada captulo le permite abordar el material de manera ordenada, para poder anticiparse a lo que est por venir y establecer un ritmo cmodo y efectivo de aprendizaje.

    Ilustraciones/Figuras. Incluimos una gran cantidad de grfi cas, tablas, dibujos lineales, programas y salidas de pro-grama. Modelamos el f lujo de control en las instrucciones de control mediante diagramas de actividad en UML. Los diagramas de clases de UML modelan los campos, constructores y mtodos de las clases. En el ejemplo prctico opcional del ATM de DOO/UML 2 hacemos uso extensivo de seis tipos principales de diagramas en UML.

    Tips de programacin. Incluimos tips de programacin para ayudarle a enfocarse en los aspectos importantes del desarrollo de programas. Estos tips y prcticas representan lo mejor que hemos podido recabar a lo largo de seis dca-das combinadas de experiencia en la programacin y la enseanza. Una de nuestras alumnas, estudiante de matemti-cas, recientemente nos coment que siente que este mtodo es similar al de resaltar axiomas, teoremas y corolarios en los libros de matemticas, ya que proporciona una base slida sobre la cual se puede construir buen software.

    Buena prctica de programacinLas buenas prcticas de programacin llaman la atencin hacia tcnicas que le ayudarn a producir programas ms claros, comprensibles y fciles de mantener.

    Error comn de programacinCon frecuencia, los estudiantes tienden a cometer ciertos tipos de errores. Al poner atencin en estos errores comunes de pro-gramacin se reduce la probabilidad de que pueda cometerlos.

    Tip para prevenir erroresEstos tips contienen sugerencias para exponer los errores y eliminarlos de sus programas; muchos de ellos describen aspectos de C++ que evitan que los errores entren a los programas.

    Tip de rendimientoA los estudiantes les gusta turbo cargar sus programas. Estos tips resaltan las oportunidades para hacer que sus programas se ejecuten ms rpido, o para minimizar la cantidad de memoria que ocupan.

    Mtodo de enseanza xxi

    C00_Preliminares_C++.indd xxiC00_Preliminares_C++.indd xxi 6/20/08 2:10:29 AM6/20/08 2:10:29 AM

  • xxii Prefacio

    Tip de portabilidadIncluimos tips de portabilidad para ayudarle a escribir cdigo que pueda ejecutarse en una variedad de plataformas, y que expliquen cmo es que C++ logra su alto grado de portabilidad.

    Observacin de Ingeniera de SoftwareLas observaciones de ingeniera de software resaltan los asuntos de arquitectura y diseo, lo cual afecta la construccin de los sistemas de software, especialmente los de gran escala.

    Seccin de repaso. Cada uno de los captulos termina con una breve seccin de repaso, que recapitula el contenido del captulo y ofrece una transicin al siguiente captulo.

    Vietas de resumen. Cada captulo termina con estrategias pedaggicas adicionales. Presentamos un resumen detallado del captulo, estilo lista con vietas, seccin por seccin.

    Terminologa. Incluimos una lista alfabetizada de los trminos importantes defi nidos en cada captulo.

    Ejercicios de autoevaluacin y respuestas. Se incluyen diversos ejercicios de autoevaluacin con sus respuestas, para que los estudiantes practiquen por su cuenta.

    Ejercicios. Cada captulo concluye con un diverso conjunto de ejercicios, incluyendo recordatorios simples de termino-loga y conceptos importantes; identifi car los errores en muestras de cdigo, escribir instrucciones individuales de C++; escribir pequeas porciones de funciones y clases; escribir funciones, clases y programas completos; y crear proyectos fi nales importantes. El extenso nmero de ejercicios permite a los instructores adaptar sus cursos a las necesidades nicas de sus estudiantes, y variar las asignaciones de los cursos cada semestre. Los instructores pueden usar estos ejercicios para formar tareas, exmenes cortos, exmenes regulares y proyectos fi nales. En nuestro Centro de Recursos de Proyectos de Programacin (www.deitel.com/ProgrammingProjects/) podr consultar muchos ejercicios adicionales y posibilida-des de proyectos. [NOTA: No nos escriba para solicitar acceso al Centro de Recursos para Instructores. El acceso est limitado estrictamente a profesores universitarios que impartan clases con base en el libro. Slo se puede obtener acceso a travs de los representantes de Pearson Educacin].

    Miles de entradas en el ndice. Hemos incluido un extenso ndice, que es en especial til cuando se utiliza el libro como referencia.

    Doble indexado de ejemplos de cdigo activo de C++. Para cada programa de cdigo fuente en el libro, indexamos la leyenda de la fi gura en forma alfabtica y como subndice, bajo Ejemplos. Esto facilita encontrar los ejemplos usando las caractersticas especiales.

    Recorrido a travs del libroAhora vamos a dar un vistazo a las herramientas de C++ que estudiar en Cmo programar en C++, sexta edicin. La fi gura 1 ilustra las dependencias entre los captulos. Le recomendamos estudiar los temas en el orden indicado por las f lechas, aunque es posible utilizar otras secuencias. Este libro se utiliza ampliamente en todos los niveles de cursos de progra-macin de C++. Busque en Web la palabra programa de estudios, C++ y Deitel para encontrar los programas de estudios que se utilizan con las ediciones recientes de este libro. Captulo 1, Introduccin a las computadoras, Internet y World Wide Web: habla sobre lo que son las compu-tadoras, cmo trabajan y cmo se programan. Este captulo presenta una breve historia del desarrollo de los lenguajes de programacin, partiendo desde los lenguajes mquina, pasando por los lenguajes ensambladores y terminando con los lenguajes de alto nivel. Se habla tambin sobre los orgenes del lenguaje de programacin C++. El captulo incluye una introduccin a un entorno de programacin comn en C++. Llevamos a los lectores a travs de un recorrido de prueba de una aplicacin comn de C++ en las plataformas Windows y Linux. Tambin se presentan los conceptos bsicos y la terminologa de la tecnologa de objetos, y el Lenguaje Unifi cado de Modelado. Captulo 2, Introduccin a la programacin en C++: ofrece una breve introduccin a la programacin de aplica-ciones en el lenguaje de programacin C++. Este captulo presenta conceptos y construcciones bsicas de programacin para no programadores. Los programas de este captulo ilustran cmo mostrar datos en pantalla y cmo obtener datos del usuario mediante el teclado. El captulo termina con un anlisis detallado de la toma de decisiones y las operaciones aritmticas. Captulo 3, Introduccin a las clases y los objetos: ofrece una primera introduccin amigable a las clases y los objetos. Pone a los estudiantes a trabajar con la orientacin a objetos de una manera confortable desde el principio.

    C00_Preliminares_C++.indd xxiiC00_Preliminares_C++.indd xxii 6/20/08 2:10:30 AM6/20/08 2:10:30 AM

  • El captulo se desarroll con la gua de un distinguido equipo de revisores acadmicos y de la industria. Presentamos las clases, los objetos, las funciones miembro, los constructores y los miembros de datos, utilizando una serie de ejemplos simples y reales. Desarrollamos un marco de trabajo bien diseado para organizar programas orientados a objetos en C++. Primero, motivamos la nocin de las clases con un ejemplo simple. Despus presentamos una secuencia cuidadosa-mente elaborada de siete programas funcionales completos, para demostrar cmo puede crear y utilizar sus propias clases. Estos ejemplos comienzan nuestro ejemplo prctico integrado acerca del desarrollo de una clase de libro de califi -caciones, que los instructores pueden utilizar para administrar las califi caciones de las pruebas de sus estudiantes. Este ejemplo prctico se mejora a lo largo de los siguientes captulos, culminando con la versin que se presenta en el captulo 7, Arreglos y vectores. El ejemplo prctico de la clase LibroCalificaciones describe cmo defi nir y utiliza una clase para

    Figura 1 | Grfi co de dependencias de los captulos de Cmo programar en C++, sexta edicin.

    Recorrido a travs del libro xxiii

    C00_Preliminares_C++.indd xxiiiC00_Preliminares_C++.indd xxiii 6/20/08 2:10:31 AM6/20/08 2:10:31 AM

  • xxiv Prefacio

    crear un objeto. Tambin describe cmo declarar y defi nir funciones miembro para implementar los comportamientos de la clase, cmo declarar miembros de datos para implementar los atributos de la clase y cmo llamar a las funciones miembro de un objeto para que lleven a cabo sus tareas. Presentamos la clase string de la Biblioteca Estndar de C++ y creamos objetos string para almacenar el nombre de un curso representado por un objeto LibroCalificaciones. El captulo 3 explica las diferencias entre los miembros de datos de una clase y las variables locales de una funcin, y cmo utilizar un constructor para asegurar que se inicialicen los datos de un objeto a la hora de crearlo. Le mostramos cmo promover la reutilizacin de software, separando la defi nicin de una clase del cdigo cliente (por ejemplo, la funcin main) que utiliza a esa clase. Tambin introducimos otro principio fundamental de la buena ingeniera de software: separar la interfaz de la implementacin. El captulo incluye un diagrama detallado y un anlisis en el que se explica el proceso de compilacin y vinculacin, que produce una aplicacin ejecutable. Captulo 4, Instrucciones de control: parte 1: se enfoca en el proceso de desarrollo de programas implicado en la creacin de clases tiles. Este captulo habla sobre cmo tomar un enunciado del problema y, a partir de l, desarrollar un programa funcional en C++, incluyendo la realizacin de los pasos intermedios con seudocdigo. Tambin introduce ciertas instrucciones simples de control para la toma de decisiones (if e if...else) y la repeticin (while). Analizamos la repeti-cin controlada por contador y la repeticin controlada por centinela, usando la clase LibroCalificaciones del captulo 3, y presentamos los operadores de incremento, decremento y asignacin de C++. Este captulo incluye dos versiones mejo-radas de la clase LibroCalificaciones, cada una de ellas basada en la versin fi nal del captulo 3. Cada versin incluye una funcin miembro que utiliza instrucciones de control para calcular el promedio de un conjunto de califi caciones de estudiantes. En la primera versin, la funcin miembro utiliza la repeticin controlada por contador para recibir 10 califi ca-ciones de estudiantes del usuario, y despus determina la califi cacin promedio. En la segunda versin, la funcin miembro utiliza la repeticin controlada por contador para recibir un nmero arbitrario de califi caciones del usuario, y despus calcula el promedio de las califi caciones que se introdujeron. El captulo utiliza los diagramas de actividad simples de UML para mostrar el f lujo de control a travs de cada una de las instrucciones de control. Captulo 5, Instrucciones de control, parte 2: contina hablando sobre las instrucciones de control de C++, con ejemplos de la instruccin de repeticin for, la instruccin de repeticin do...while, la instruccin de seleccin switch,las instrucciones break y continue. Creamos una versin mejorada de la clase LibroCalificaciones que utiliza una instruccin switch para contar el nmero de califi caciones A, B, C, D y F introducidas por el usuario. Esta versin uti-liza la repeticin controlada por centinela para introducir las califi caciones. Mientras se leen las califi caciones del usuario, una funcin miembro modifi ca los miembros de datos que llevan la cuenta de las califi caciones en cada categora de letra. Despus, otra funcin miembro de la clase utiliza estos miembros de datos para mostrar un informe de resumen, con base en las califi caciones introducidas. Tambin se incluye una discusin sobre los operadores lgicos. Captulo 6, Funciones y una introduccin a la recursividad: ofrece un anlisis ms detallado de los objetos y sus funciones miembro. Aqu hablaremos sobre las funciones de la Biblioteca estndar de C++ y analizaremos con ms detalle la forma en que los estudiantes pueden crear sus propias funciones. Las tcnicas que se presentan en el captulo 6 son esenciales para producir programas correctamente estructurados, especialmente los programas ms grandes y el software que desarrollan los programadores de sistemas y de aplicaciones en el mundo real. La estrategia divide y vencers se presenta como un medio efectivo para resolver problemas complejos, al dividirlos en componentes interactivos ms sim-ples. El primer ejemplo del captulo contina el ejemplo prctico de la clase LibroCalificaciones con un ejemplo de una funcin con varios parmetros. Los estudiantes disfrutarn el tratamiento que se da a los nmeros aleatorios y la simulacin en este captulo, as como la discusin sobre el juego de dados llamado craps, que hace un uso elegante de las instrucciones de control. Tambin se habla sobre las denominadas Mejoras que C++ hace a C, incluyendo las funciones inline, los parmetros por referencia, los argumentos predeterminados, el operador unario de resolucin de alcance, la sobrecarga de funciones y las plantillas de funciones. Adems, presentamos las herramientas de llamada por valor y llamada por referencia de C++. La tabla de archivos de encabezado introduce muchos de los archivos de encabezado que utilizar a travs del libro. En esta nueva edicin, proporcionamos una discusin detallada (con ilustraciones) sobre la pila de llamadas a funciones y los registros de activacin, para explicar cmo C++ puede llevar el registro de la funcin que se est ejecutando en un momento dado, cmo se mantienen las variables automticas de funciones en la memoria y cmo sabe una funcin a dnde debe regresar, una vez que termine su ejecucin. Despus el captulo ofrece una concisa introduccin a la recursividad, e incluye una tabla que sintetiza los ejemplos y ejercicios de recursividad distribuidos en el resto del libro. Algunos textos dejan la recursividad para uno de los ltimos captulos; nosotros sentimos que este tema se cubre mejor de manera gradual, a lo largo del texto. La extensa coleccin de ejercicios al fi nal del captulo incluye varios problemas clsicos de recursividad, incluyendo las Torres de Hanoi. Captulo 7, Arreglos y vectores: explica cmo procesar las listas de procesamiento y las tablas de valores. Aqu hablaremos sobre la estructuracin de datos en arreglos de elementos de datos del mismo tipo, y demostraremos cmo los arreglos facilitan las tareas que realizan los objetos. En las primeras partes de este captulo se utilizan los arreglos basa-

    C00_Preliminares_C++.indd xxivC00_Preliminares_C++.indd xxiv 6/20/08 2:10:33 AM6/20/08 2:10:33 AM

  • dos en apuntadores estilo C que, como veremos en el captulo 8, se pueden tratar como apuntadores al contenido de los arreglos en la memoria. Luego presentaremos los arreglos como objetos completos, con una introduccin a la plantilla de clase vector de la Biblioteca estndar de C++: una estructura de datos tipo arreglo robusta. El captulo presenta nume-rosos ejemplos, tanto de los arreglos unidimensionales como de los multidimensionales. Los ejemplos en este captulo investigan varias manipulaciones comunes de los arreglos, la impresin de grfi cos de barras, el ordenamiento de datos y el proceso de pasar arreglos a las funciones. Tambin se incluyen las ltimas dos secciones del ejemplo prctico de LibroCalificaciones, en donde utilizamos arreglos para almacenar las califi caciones de los estudiantes durante la ejecucin de un programa. Las versiones anteriores de la clase procesan un conjunto de califi caciones que introduce el usuario, pero no mantienen los valores de cada califi cacin en los miembros de datos de la clase. En este captulo utiliza-mos los arreglos para permitir que un objeto de la clase LibroCalificaciones mantenga un conjunto de califi caciones en memoria, con lo cual se elimina la necesidad de introducir repetidas veces el mismo conjunto de califi caciones. La primera versin de la clase almacena las califi caciones en un arreglo unidimensional, y puede producir un informe que contiene el promedio de las califi caciones, las califi caciones mnima y mxima, y un grfi co de barras que representa la distribucin de las califi caciones. La segunda versin (es decir, la versin fi nal en el ejemplo prctico) utiliza un arreglo bidimensional para almacenar las califi caciones de varios estudiantes, en diversos exmenes durante un semestre. Esta versin puede calcular el promedio semestral de cada estudiante, as como las califi caciones mnima y mxima de todas las califi caciones recibidas durante el semestre. La clase tambin produce un grfi co de barras, el cual muestra la distri-bucin total de califi caciones para el semestre. Otra caracterstica clave de este captulo es la discusin sobre las tcnicas elementales de ordenamiento y bsqueda. Los ejercicios de fi nal de captulo incluyen una variedad de problemas inte-resantes y retadores, como las tcnicas de ordenamiento mejoradas, el diseo de un sistema simple de reservaciones de una aerolnea, una introduccin al concepto de los grfi cos de tortuga (que se hicieron famosos en el lenguaje LOGO) y los problemas Paseo del caballo y Ocho reinas, que introducen la nocin de la programacin heurstica, que se utiliza ampliamente en el campo de la inteligencia artifi cial. Los ejercicios concluyen con muchos problemas de recursividad, incluyendo el ordenamiento por seleccin, los palndromos, la bsqueda lineal, las Ocho reinas, imprimir un arreglo, imprimir una cadena al revs y buscar el valor mnimo en un arreglo. Captulo 8, Apuntadores y cadenas basadas en apuntadores: presenta una de las caractersticas ms poderosas del lenguaje C++: los apuntadores. El captulo proporciona explicaciones detalladas de los operadores de apuntadores, la llamada por referencia, las expresiones de apuntadores, la aritmtica de apuntadores, la relacin entre apuntadores y arre-glos, los arreglos de apuntadores y los apuntadores a funciones. Demostramos cmo utilizar const con apuntadores para cumplir con el principio del menor privilegio y poder crear software ms robusto. Hablamos acerca del uso del operador sizeof para determinar el tamao de un tipo de datos, o de los elementos de datos en bytes durante la compilacin de un programa. Hay una estrecha relacin entre los apuntadores, los arreglos y las cadenas estilo C en C++, por lo que presen-tamos los conceptos bsicos de manipulacin de cadenas estilo C y hablamos sobre algunas de las funciones para manejar cadenas estilo C ms populares, como getline (recibir una lnea de texto), strcpy y strncpy (copiar una cadena), strcat y strncat (concatenar dos cadenas), strcmp y strncmp (comparar dos cadenas), strtok (dividir una cadena en sus piezas bsicas) y strlen (devolver la longitud de una cadena). En esta nueva edicin utilizamos con frecuencia objetos string (introducidos en el captulo 3, Introduccin a las clases y los objetos) en vez de las cadenas basadas en apuntadores char *, estilo C. Sin embargo, incluimos las cadenas char * en el captulo 8 para ayudar al lector a dominar los apuntadores, y prepararlo para el mundo profesional, en el que ver una gran cantidad de cdigo heredado de C, que se ha implementado durante las ltimas tres dcadas. Por ende, se familiarizar con los dos mtodos ms prevalecientes de crear y manipular cadenas en C++. Muchas personas descubren que el tema de los apuntadores es, hasta ahora, la parte ms difcil de un curso introductorio de programacin. En C y en C++ puro, los arreglos y las cadenas son apuntadores al contenido de arreglos y cadenas en la memoria (inclusive hasta los nombres de las funciones son apuntadores). Si estu-dia este captulo con cuidado, obtendr como recompensa una detallada comprensin de los apuntadores. Este captulo est repleto de ejercicios retadores. Los ejercicios del captulo incluyen una simulacin de la clsica carrera entre la tortuga y la liebre, algoritmos para barajar y repartir cartas, el ordenamiento rpido (quicksort) recursivo y recorridos recursivos de laberintos. Tambin se incluye una seccin especial titulada Construya su propia computadora. Esta seccin expli-ca la programacin en lenguaje mquina y procede con un proyecto en el que se involucra el diseo y la implementacin de un simulador de computadora, el cual lleva al estudiante a escribir y ejecutar programas en lenguaje mquina. Esta caracterstica nica del texto ser en especial til para los lectores que deseen comprender el verdadero funcionamiento de las computadoras. Nuestros estudiantes disfrutan este proyecto y a menudo implementan mejoras sustanciales, muchas de las cuales se sugieren en los ejercicios. Una segunda seccin especial incluye ejercicios retadores de manipulacin de cadenas, relacionados con el anlisis de texto, procesamiento de palabras, impresin de fechas en varios formatos, pro-teccin de cheques, escribir el equivalente de un monto de un cheque, cdigo Morse y conversiones del sistema mtrico al ingls.

    Recorrido a travs del libro xxv

    C00_Preliminares_C++.indd xxvC00_Preliminares_C++.indd xxv 6/20/08 2:10:34 AM6/20/08 2:10:34 AM

  • xxvi Prefacio

    Captulo 9, Clases: un anlisis ms detallado, parte 1: contina con nuestra discusin sobre la programacin orientada a objetos. Este captulo utiliza un ejemplo prctico muy completo con la clase Tiempo, para ilustrar el acceso a los miembros de una clase, separar la interfaz de la implementacin, usar las funciones de acceso y las funciones utilita-rias, inicializar objetos mediante constructores, destruir objetos mediante destructores, la asignacin mediante la copia a nivel de miembro predeterminada y la reutilizacin de software. Los estudiantes aprenden el orden en el que se llama a los constructores y destructores durante el tiempo de vida de un objeto. Una modifi cacin del ejemplo prctico de Tiempo demuestra los problemas que pueden ocurrir cuando una funcin miembro devuelve una referencia a un miembro de datos private, lo cual quebranta el encapsulamiento de la clase. Los ejercicios del captulo retan al estudiante a que desa-rrolle clases para tiempos, fechas, rectngulos y jugar al tres en raya. Por lo general, los estudiantes disfrutan los programas de juegos. Los lectores inclinados hacia las matemticas disfrutarn los ejercicios relacionados con la creacin de la clase Complejo (para los nmeros complejos), la clase Racional (para los nmeros racionales) y la clase EnteroEnorme (para los enteros arbitrariamente grandes). Captulo 10, Clases: un anlisis ms detallado, parte 2: contina el estudio de las clases y presenta conceptos adicionales de programacin orientada a objetos. El captulo habla sobre cmo declarar y utilizar objetos constantes, funciones miembro constantes, la composicin (el proceso de crear clases que tengan objetos de otras clases como miem-bros), las funciones friend y las clases friend que tienen derechos de acceso especiales para los miembros private y protected de las clases, el apuntador this, que permite a un objeto conocer su propia direccin, la asignacin dinmica de memoria, los miembros de clase static para contener y manipular datos a nivel de clase, ejemplos de los tipos de datos abstractos populares (arreglos, cadenas y colas), clases contenedoras e iteradores. En nuestra discusin sobre los objetos const mencionamos la palabra clave mutable, que se utiliza de una manera sutil para permitir la modifi cacin de la implementacin invisible en los objetos const. Hablaremos sobre la asignacin dinmica de memoria median-te el uso de new y delete. Cuando falla new, el programa termina de manera predeterminada, ya que new lanza una excepcin en el lenguaje C++ estndar. Motivamos la discusin de los miembros de clase static con un ejemplo basado en un videojuego. Enfatizamos lo importante que es ocultar los detalles de implementacin de los clientes de una clase; despus hablamos sobre las clases de proxy, que proporcionan un medio para ocultar la implementacin (incluyendo los datos private en los encabezados de las clases) a los clientes de una clase. Los ejercicios del captulo incluyen el desarro-llo de una clase de cuenta de ahorros y una clase para contener conjuntos de enteros. Captulo 11, Sobrecarga de operadores: objetos String y Array: presenta uno de los temas ms populares en nuestros cursos de C++. Los estudiantes realmente disfrutan este material. Les parece un complemento perfecto para el anlisis detallado de cmo construir clases valiosas en los captulos 9 y 10. La sobrecarga de operadores nos permite decir al compilador cmo utilizar los operadores existentes con objetos de nuevos tipos. C++ sabe de antemano cmo utilizar estos operadores con objetos de tipos integrados, como enteros, nmeros de punto f lotante y caracteres. Pero suponga que creamos una nueva clase String; qu signifi cara el signo de suma al utilizarlo entre objetos String? Muchos programadores usan la suma (+) con cadenas para indicar la concatenacin. En el captulo 11 aprender a sobrecargar el signo de suma, de manera que cuando se escriba entre dos objetos String en una expresin, el compilador generar la llamada a una funcin operador que concatenar los dos objetos String. El captulo describe los fundamentos de la sobrecarga de operadores, las restricciones en la sobrecarga de operadores, la comparacin entre la sobrecarga con fun-ciones miembro de clase y funciones no miembro, la sobrecarga de operadores unarios y binarios, y la conversin entre tipos. El captulo 11 contiene una coleccin de ejemplos prcticos sustanciales, incluyendo una clase de arreglo, una clase String, una clase de fecha, una clase de entero enorme y una clase de nmeros complejos (las ltimas dos aparecen con el cdigo fuente completo en los ejercicios). Los estudiantes con inclinacin a las matemticas disfrutarn la creacin de la clase polinomio en los ejercicios. Este material es distinto de la mayora de los lenguajes y cursos de programacin. La sobrecarga de operadores es un tema complejo, pero enriquecedor. El uso inteligente de la sobrecarga de operadores nos ayuda a agregar un pulido adicional a nuestras clases. Las discusiones sobre la clase Array y la clase String son especialmente valiosas para los estudiantes que ya han utilizado la clase string de la Biblioteca estndar de C++ y la plantilla de clase vector, las cuales proporcionan caractersticas similares. Los ejercicios alientan al estudiante para que agregue la sobrecarga de operadores a las clases Complejo, Racional y EnteroEnorme, para permitir una manipulacin conveniente de objetos de estas clases con los smbolos de los operadores (al igual que en las matemticas), en vez de hacerlo con las llamadas a funciones, como hizo el estudiante en los ejercicios del captulo 10. Captulo 12, Programacin orientada a objetos: herencia: introduce una de las capacidades ms fundamentales de los lenguajes de programacin orientados a objetos: la herencia, una forma de reutilizacin de software en la que las nuevas clases se desarrollan con rapidez y facilidad, absorbiendo las capacidades de las clases existentes y agregando nuevas capacidades apropiadas. En el contexto de un ejemplo prctico con la jerarqua Empleado, este captulo (que se revis minuciosamente) presenta una secuencia de cinco ejemplos en la que se demuestra el uso de los datos private, los datos protected y la buena ingeniera de software con la herencia. Para empezar, demostramos una clase con miem-bros de datos private y funciones miembro public para manipular esos datos. Despus, implementamos una segunda

    C00_Preliminares_C++.indd xxviC00_Preliminares_C++.indd xxvi 6/20/08 2:10:34 AM6/20/08 2:10:34 AM

  • clase con capacidades adicionales, duplicando de manera intencional y tediosa la mayor parte del cdigo del primer ejemplo. El tercer ejemplo empieza nuestra discusin sobre la herencia y la reutilizacin de software; utilizamos la clase del primer ejemplo como una clase base y heredamos de una manera rpida y simple sus datos y su funcionalidad, para crear una nueva clase derivada. Este ejemplo introduce el mecanismo de la herencia y demuestra que una clase derivada no puede acceder directamente a los miembros private de su clase base. Esto motiva nuestro cuarto ejemplo, en el que introducimos datos protected en la clase base y demostramos que la clase derivada puede, sin duda, acceder a los datos protected heredados de la clase base. El ltimo ejemplo en la secuencia demuestra la ingeniera de software apropiada, al defi nir los datos de la clase base como private y utilizar las funciones miembro public de la clase (que hered la clase derivada) para manipular los datos private de la clase base en la clase derivada. El captulo habla acerca de las nociones de las clases base y las clases derivadas, los miembros protected, la herencia public, la herencia protected, la herencia private, las clases base directas, las clases base indirectas, los constructores y los destructores en las clases base y las clases derivadas, y la ingeniera de software con la herencia. El captulo tambin compara la herencia (la relacin es un) con la composicin (la relacin tiene un), e introduce las relaciones utiliza un y conoce un. Captulo 13, Programacin orientada a objetos: polimorfi smo: trata con otra herramienta fundamental de la programacin orientada a objetos: el comportamiento polimrfi co. El captulo 13, que se revis por completo, se basa en los conceptos de la herencia presentados en el captulo 12 y se enfoca en las relaciones entre las clases en una jerarqua de clases, y en las poderosas capacidades de procesamiento que habilitan estas relaciones. Cuando muchas clases estn relacionadas con una clase base comn a travs de la herencia, cada objeto de clase derivada puede tratarse como un objeto de la clase base. Esto permite que los programas se escriban de una manera simple y general, independiente de los tipos especfi cos de los objetos de las clases derivadas. Pueden manejarse nuevos tipos de objetos mediante el mismo programa, con lo cual los siste-mas se hacen ms extensibles. El polimorfi smo permite a los programas eliminar la compleja lgica de la instruccin switch, a favor de una lgica de lnea recta ms simple. Por ejemplo, el administrador de la pantalla de un videojuego puede enviar un mensaje dibujar a cada objeto en una lista enlazada de objetos a dibujar. Cada objeto sabe cmo dibujarse a s mismo. Puede agregarse un objeto de una nueva clase al programa sin necesidad de modifi carlo (siempre y cuando el nuevo objeto tambin sepa cmo dibujarse a s mismo). Este captulo habla sobre la mecnica de lograr el comportamiento polimrfi co a travs de las funciones virtual. Hace diferencia entre las clases abstractas (de las que no se pueden crear instancias de obje-tos) y las clases concretas (de las que se pueden crear instancias de objetos). Las clases abstractas son tiles para proporcionar una interfaz heredable a las clases, a lo largo de la jerarqua. Demostramos las clases abstractas y el comportamiento polimr-fi co con una nueva revisin de la jerarqua Empleado del captulo 12. Presentamos una clase base Empleado abstracta, a partir de la cual las clases EmpleadoPorComision, EmpleadoPorHoras y EmpleadoAsalariado heredan directamente, y la clase EmpleadoBaseMasComision hereda indirectamente. En el pasado, nuestros clientes profesionales han insistido que proporcionemos una explicacin ms detallada, que muestre con precisin cmo se implementa el polimorfi smo en C++, y por ende, precisamente en cunto tiempo de ejecucin y uso de memoria se incurre al programar con esta poderosa herramienta. Respondimos a esta peticin desarrollando una ilustracin y una explicacin precisa de las vtables (tablas de funciones virtual), que el compilador de C++ genera en forma automtica para dar soporte al polimorfi smo. Para concluir, presentamos la informacin de tipos en tiempo de ejecucin (RTTI) y la conversin dinmica, que permiten a un programa determinar el tipo de un objeto en tiempo de ejecucin, y despus actuar sobre ese objeto de manera acorde. Mediante el uso de RTTI y la conversin dinmica, otorgamos un 10% de incremento en el sueldo de los empleados de un tipo especfi co, y despus calculamos los ingresos para dichos empleados. Para todos los dems tipos de empleados, calculamos los ingresos mediante el polimorfi smo. Captulo 14, Plantillas: habla acerca de una de las caractersticas de reutilizacin de software ms poderosas: a saber, las plantillas. Las plantillas de funciones y las plantillas de clases nos permiten especifi car, con un solo segmento de cdi-go, un rango completo de funciones sobrecargadas relacionadas (llamadas especializaciones de plantillas de funciones), o todo un rango de clases relacionadas (llamadas especializaciones de plantillas de clases). A esta tcnica se le conoce como programacin genrica. En el captulo 6 se introdujeron las plantillas de funciones. Este captulo presenta discusiones y ejemplos adicionales sobre las plantilla de funciones. Podramos escribir una sola plantilla de clase para una clase de pila, y despus hacer que C++ genere especializaciones de plantilla de clases separadas, como una clase pila de int, una clase pila de float, una clase pila de string, y as en lo sucesivo. El captulo habla sobre el uso de parmetros con tipo, parmetros sin tipo y tipos predeterminados para las plantillas de clases. Tambin hablamos sobre las relaciones entre las plantillas y otras caractersticas de C++, como la sobrecarga, la herencia, los miembros friend y static. Los ejercicios retan al estudiante a escribir una variedad de plantillas de funciones y plantillas de clases, y a emplear stas en programas completos. Mejoramos en forma considerable el tratamiento de las plantillas en nuestra discusin sobre los contenedores, iteradores y algoritmos de la Biblioteca de plantillas estndar (STL) en el captulo 22. Captulo 15, Entrada y salida de f lujos: contiene un tratamiento detallado sobre las herramientas de entra-da/salida de C++. Este captulo habla sobre un rango de herramientas sufi ciente como para realizar la mayora de las operaciones comunes de E/S, y describe las generalidades del resto de las herramientas. Muchas de las caractersticas

    Recorrido a travs del libro xxvii

    C00_Preliminares_C++.indd xxviiC00_Preliminares_C++.indd xxvii 6/20/08 2:10:35 AM6/20/08 2:10:35 AM

  • xxviii Prefacio

    de E/S estn orientadas a objetos. Este estilo de E/S hace uso de otras caractersticas de C++, como las referencias, la sobrecarga de funciones y la sobrecarga de operadores. Las diversas herramientas de E/S de C++, incluyen las operaciones de salida con el operador de insercin de f lujo, las operaciones de entrada con el operador de extraccin de f lujo, la E/S con seguridad de tipos, la E/S con formato, y la E/S sin formato (para mejorar el rendimiento). Los usuarios pueden especifi car cmo llevar a cabo la E/S para objetos de tipos defi nidos por el usuario, mediante la sobrecarga del operador de insercin de f lujo (). Esta extensibilidad es una de las caractersticas ms valiosas de C++. Este lenguaje cuenta con varios manipuladores de f lujos que realizan tareas de formato. Este captulo habla sobre los manipuladores de f lujos que proporcionan herramientas tales como mostrar enteros en varias bases, controlar la precisin de los nmeros de punto f lotante, establecer las anchuras de los campos, mostrar el punto decimal y los ceros a la derecha, justifi car la salida, ajustar y desajustar el estado del formato, establecer el carcter de relleno en los campos. Tambin presentamos un ejemplo que crea manipuladores de f lujos de salida defi nidos por el usuario. Captulo 16, Manejo de excepciones: habla acerca de cmo el manejo de excepciones nos permite escribir pro-gramas robustos, tolerantes a fallas y apropiados para los entornos de negocio crtico o de misin crtica. El captulo habla acerca de cundo es apropiado el manejo de excepciones; introduce las herramientas bsicas de manejo de excep-ciones con los bloques try, las instrucciones throw y los manejadores catch; indica cmo y cundo volver a lanzar una excepcin; explica cmo escribir la especifi cacin de una excepcin y procesar las excepciones inesperadas; y habla acerca de los importantes lazos entre las excepciones y los constructores, los destructores y la herencia. Los ejercicios en este captulo muestran al estudiante la diversidad y el poder de las herramientas de manejo de excepciones de C++. Hablamos sobre cmo volver a lanzar una excepcin, e ilustramos cmo puede fallar new cuando se agota la memoria. Muchos compiladores antiguos de C++ devuelven 0 de manera predeterminada cuando falla new. Mostramos el nuevo estilo de falla de new, mediante el lanzamiento de una excepcin bad_alloc (asignacin incorrecta). Ilustramos cmo utilizar la funcin set_new_handler para especifi car que se va a llamar una funcin personalizada para lidiar con las situaciones en las que se agota la memoria. Hablamos acerca de cmo usar la plantilla de clase auto_ptr para eliminar (delete) implcitamente la memoria asignada en forma dinmica, con lo cual se evitan las fugas de memoria. Para concluir este captulo, presentamos la jerarqua de excepciones de la Biblioteca estndar. Captulo 17, Procesamiento de archivos: habla sobre las tcnicas para crear y procesar tanto archivos secuencia-les, como archivos de acceso aleatorio. Este captulo empieza con una introduccin a la jerarqua de datos, de los bits a los bytes, los campos, los registros y los archivos. Despus, presentamos la forma en que C++ interpreta los archivos y los f lujos. Hablamos sobre los archivos secuenciales y creamos programas que muestran cmo abrir y cerrar archivos, cmo almacenar datos en forma secuencial en un archivo, y cmo leer datos en forma secuencial de un archivo. Despus habla-mos sobre los archivos de acceso aleatorio y creamos programas que muestren cmo crear un archivo para acceso aleatorio, cmo leer y escribir datos de/a un archivo con acceso aleatorio, y cmo leer datos secuencialmente de un archivo con acce-so aleatorio. El ejemplo prctico combina las tcnicas de acceso a los archivos, tanto en forma secuencial como aleatoria, en un programa completo para procesar transacciones. Los estudiantes en nuestros seminarios industriales han mencionado que, despus de estudiar el material sobre procesamiento de archivos, pudieron producir programas substanciales para procesar archivos, que fueron tiles de inmediato en sus organizaciones. Los ejercicios piden al estudiante que implemente una variedad de programas que generen y procesen tanto archivos secuenciales como archivos de acceso aleatorio. Captulo 18, La clase string y el procesamiento de f lujos de cadena: habla acerca de las herramientas de C++ para recibir datos de entrada de cadenas en la memoria, y enviar datos a cadenas en la memoria; con frecuencia, a estas herramientas se les conoce como E/S en memoria o procesamiento de f lujos de cadena. La clase string es un componente requerido de la Biblioteca estndar. Preservamos el tratamiento de cadenas basadas en apuntadores estilo C en los captu-los 8 y posteriores, por varias razones. En primer lugar, refuerza la comprensin del lector acerca de los apuntadores. En segundo lugar, durante la siguiente dcada o ms, los programadores de C++ tendrn que ser capaces de leer y modifi car la enorme cantidad de cdigo heredado de C, que se ha acumulado durante el ltimo trimestre de un siglo; este cdigo pro-cesa las cadenas como apuntadores, al igual que una gran parte del cdigo de C++ que se ha escrito en la industria, durante los ltimos aos. En el captulo 18 hablamos sobre la asignacin, concatenacin y comparacin de objetos string. Mostramos cmo determinar varias caractersticas de string, como el tamao y la capacidad de un objeto string, y si est vaco o no. Hablamos sobre cmo cambiar el tamao de un objeto string. Consideramos las diversas funciones de bsqueda que nos permiten encontrar una subcadena dentro de un objeto string (podemos buscar ya sea hacia ade-lante o hacia atrs), y mostramos cmo encontrar la primera ocurrencia o la ltima ocurrencia de un carcter seleccionado de una cadena de caracteres, y cmo encontrar la primera ocurrencia o la ltima ocurrencia de un carcter que no se encuentra en una cadena seleccionada de caracteres. Mostramos cmo reemplazar, borrar e insertar caracteres en un objeto string y cmo convertir un objeto string en una cadena char * al estilo C. Captulo 19, Bsqueda y ordenamiento: habla sobre dos de las clases ms importantes de algoritmos en la ciencia computacional. Consideramos una variedad de algoritmos especfi cos para cada una de estas clases, y los comparamos

    C00_Preliminares_C++.indd xxviiiC00_Preliminares_C++.indd xxviii 6/20/08 2:10:35 AM6/20/08 2:10:35 AM

  • con respecto a su consumo de memoria y de procesador (presentamos la notacin Big O, la cual indica qu tan duro tiene que trabajar un algoritmo para resolver un problema). La bsqueda de datos implica determinar si un valor (denominado clave de bsqueda) est presente en los datos y, de ser as, buscar la ubicacin de ese valor. En los ejemplos y ejercicios de este captulo, hablamos acerca de una variedad de algoritmos de bsqueda, incluyendo: la bsqueda binaria y versiones recursivas de la bsqueda lineal y la bsqueda binaria. Mediante ejemplos y ejercicios, el captulo 19 habla sobre el orde-namiento por combinacin recursivo, el ordenamiento de burbuja, el ordenamiento de cubeta y el ordenamiento rpido (quicksort) recursivo. Captulo 20, Estructuras de datos: habla sobre las tcnicas utilizadas para crear y manipular estructuras de datos dinmicas. Este captulo empieza con discusiones acerca de las clases autorreferenciadas y la asignacin dinmica de memoria, y despus contina con una discusin acerca de cmo crear y mantener varias estructuras de datos dinmicas, incluyendo las listas enlazadas, las colas (o lneas de espera), las pilas y los rboles. Para cada tipo de estructura de datos, presentamos programas funcionales completos y mostramos resultados de ejemplo. El captulo tambin ayuda a que el estudiante domine los apuntadores. Incluye abundantes ejemplos que utilizan la indireccin y la indireccin doble: un concepto especialmente difcil. Uno de los problemas al trabajar con apuntadores es que a los estudiantes se les difi culta visualizar las estructuras de datos y la forma en que sus nodos estn enlazados entre s. Hemos incluido ilustraciones que muestran los enlaces y la secuencia en la que se crean. El ejemplo de rbol binario es un excelente toque fi nal para el estudio de los apuntadores y las estructuras de datos dinmicas. Este ejemplo crea un rbol binario, hace cumplir la eliminacin de duplicados y presenta los recorridos de rboles preorden, inorden y postorden recursivos. Los estudiantes tienen un sen-tido genuino de xito cuando estudian e implementan este ejemplo. En especial, aprecian ver que el recorr