Cpp

download Cpp

If you can't read please download the document

description

jhb ,nlklñb .,m b,m.lhkjfvkjnvjh ,klm,b ,mmjfklv

Transcript of Cpp

ndice general1. Introduccin a los Objetos 11.1. El progreso de abstraccin . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Cada objeto tiene una interfaz . . . . . . . . . . . . . . . . . . . . . . . . 31.3. La implementacin oculta . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4. Reutilizar la implementacin . . . . . . . . . . . . . . . . . . . . . . . . 61.5. Herencia: reutilizacin de interfaces . . . . . . . . . . . . . . . . . . . . 71.5.1. Relaciones es-un vs. es-como-un . . . . . . . . . . . . . . . . . 101.6. Objetos intercambiables gracias al polimorfismo . . . . . . . . . . . . . 111.7. Creacin y destruccin de objetos . . . . . . . . . . . . . . . . . . . . . . 151.8. Gestin de excepciones: tratamiento de errores . . . . . . . . . . . . . . 161.9. Anlisis y diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.9.1. Fase 0: Hacer un plan . . . . . . . . . . . . . . . . . . . . . . . . 181.9.1.1. Declaracin de objetivos . . . . . . . . . . . . . . . . . 191.9.2. Fase 1: Qu estamos haciendo? . . . . . . . . . . . . . . . . . . 191.9.3. Fase 2: Cmo podemos construirlo? . . . . . . . . . . . . . . . 221.9.3.1. Las cinco etapas del diseo de objetos . . . . . . . . . 231.9.3.2. Directrices para desarrollo de objetos . . . . . . . . . . 241.9.4. Fase 3: Construir el ncleo . . . . . . . . . . . . . . . . . . . . . 251.9.5. Fase 4: Iterar los casos de uso . . . . . . . . . . . . . . . . . . . . 251.9.6. Fase 5: Evolucin . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.9.7. Los planes valen la pena . . . . . . . . . . . . . . . . . . . . . . . 271.10. Programacin Extrema . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271.10.1. Escriba primero las pruebas . . . . . . . . . . . . . . . . . . . . . 281.10.2. Programacin en parejas . . . . . . . . . . . . . . . . . . . . . . . 291.11. Porqu triunfa C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301.11.1. Un C mejor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301.11.2. Usted ya est en la curva de aprendizaje . . . . . . . . . . . . . 301.11.3. Eficiencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.11.4. Los sistemas son ms fciles de expresar y entender . . . . . . . 31IIIiiVolumen1 2012/1/12 13:52 page IV #4iiiiiindice general1.11.5. Aprovechamiento mximo con libreras . . . . . . . . . . . . . . 311.11.6. Reutilizacin de cdigo fuente con plantillas . . . . . . . . . . . 321.11.7. Manejo de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.11.8. Programar a lo grande . . . . . . . . . . . . . . . . . . . . . . . . 321.12. Estrategias de transicin . . . . . . . . . . . . . . . . . . . . . . . . . . . 331.12.1. Directrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331.12.1.1. Entrenamiento . . . . . . . . . . . . . . . . . . . . . . . 331.12.1.2. Proyectos de bajo riesgo . . . . . . . . . . . . . . . . . 331.12.1.3. Modelar desde el xito . . . . . . . . . . . . . . . . . . 331.12.1.4. Use libreras de clases existentes . . . . . . . . . . . . . 341.12.1.5. No reescriba en C++ cdigo que ya existe . . . . . . . 341.12.2. Obstculos de la gestin . . . . . . . . . . . . . . . . . . . . . . . 341.12.2.1. Costes iniciales . . . . . . . . . . . . . . . . . . . . . . . 341.12.2.2. Cuestiones de rendimiento . . . . . . . . . . . . . . . . 351.12.2.3. Errores comunes de diseo . . . . . . . . . . . . . . . . 351.13. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362. Construir y usar objetos 372.1. El proceso de traduccin del lenguaje . . . . . . . . . . . . . . . . . . . 372.1.1. Intrpretes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372.1.2. Compiladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.1.3. El proceso de compilacin . . . . . . . . . . . . . . . . . . . . . . 392.1.3.1. Comprobacin esttica de tipos . . . . . . . . . . . . . 402.2. Herramientas para compilacin modular . . . . . . . . . . . . . . . . . 402.2.1. Declaraciones vs definiciones . . . . . . . . . . . . . . . . . . . . 412.2.1.1. Sintaxis de declaracin de funciones . . . . . . . . . . 412.2.1.2. Una puntualizacin . . . . . . . . . . . . . . . . . . . . 422.2.1.3. Definicin de funciones . . . . . . . . . . . . . . . . . . 422.2.1.4. Sintaxis de declaracin de variables . . . . . . . . . . . 422.2.1.5. Incluir ficheros de cabecera . . . . . . . . . . . . . . . . 432.2.1.6. Formato de inclusin del estndar C++ . . . . . . . . . 442.2.2. Enlazado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452.2.3. Uso de libreras . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452.2.3.1. Cmo busca el enlazador una librera . . . . . . . . . . 462.2.3.2. Aadidos ocultos . . . . . . . . . . . . . . . . . . . . . 462.2.3.3. Uso de libreras C plano . . . . . . . . . . . . . . . . . 472.3. Su primer programa en C++ . . . . . . . . . . . . . . . . . . . . . . . . . 472.3.1. Uso de las clases iostream . . . . . . . . . . . . . . . . . . . . . 47IViiVolumen1 2012/1/12 13:52 page V #5iiiiiindice general2.3.2. Espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . 482.3.3. Fundamentos de la estructura de los programa . . . . . . . . . . 492.3.4. Hello, World! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502.3.5. Utilizar el compilador . . . . . . . . . . . . . . . . . . . . . . . . 512.4. Ms sobre iostreams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512.4.1. Concatenar vectores de caracteres . . . . . . . . . . . . . . . . . 512.4.2. Leer de la entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . 522.4.3. Llamar a otros programas . . . . . . . . . . . . . . . . . . . . . . 532.5. Introducin a las cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . 532.6. Lectura y escritura de ficheros . . . . . . . . . . . . . . . . . . . . . . . . 542.7. Introduccin a los vectores . . . . . . . . . . . . . . . . . . . . . . . . . . 562.8. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592.9. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603. C en C++ 633.1. Creacin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.1.1. Valores de retorno de las funciones . . . . . . . . . . . . . . . . . 653.1.2. Uso de funciones de libreras C . . . . . . . . . . . . . . . . . . . 663.1.3. Creacin de libreras propias . . . . . . . . . . . . . . . . . . . . 663.2. Control de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.2.1. Verdadero y falso . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.2.2. if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.2.3. while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.2.4. do-while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693.2.5. for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703.2.6. Las palabras reservadas break y continue . . . . . . . . . . . 703.2.7. switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723.2.8. Uso y maluso de goto . . . . . . . . . . . . . . . . . . . . . . . . 733.2.9. Recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743.3. Introduccin a los operadores . . . . . . . . . . . . . . . . . . . . . . . . 743.3.1. Precedencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753.3.2. Auto incremento y decremento . . . . . . . . . . . . . . . . . . . 753.4. Introduccin a los tipos de datos . . . . . . . . . . . . . . . . . . . . . . 763.4.1. Tipos predefinidos bsicos . . . . . . . . . . . . . . . . . . . . . . 763.4.2. booleano, verdadero y falso . . . . . . . . . . . . . . . . . . . . . 773.4.3. Especificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783.4.4. Introduccin a punteros . . . . . . . . . . . . . . . . . . . . . . . 793.4.5. Modificar objetos externos . . . . . . . . . . . . . . . . . . . . . . 82ViiVolumen1 2012/1/12 13:52 page VI #6iiiiiindice general3.4.6. Introduccin a las referencias de C++ . . . . . . . . . . . . . . . 843.4.7. Punteros y Referencias como modificadores . . . . . . . . . . . 853.5. Alcance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863.5.1. Definicin de variables al vuelo . . . . . . . . . . . . . . . . . 873.6. Especificar la ubicacin del espacio de almacenamiento . . . . . . . . . 893.6.1. Variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . 893.6.2. Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . 903.6.2.1. Variables registro . . . . . . . . . . . . . . . . . . . . . 903.6.3. Static . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913.6.4. extern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923.6.4.1. Enlazado . . . . . . . . . . . . . . . . . . . . . . . . . . 933.6.5. Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933.6.5.1. Valores constantes . . . . . . . . . . . . . . . . . . . . . 943.6.6. Volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953.7. Los operadores y su uso . . . . . . . . . . . . . . . . . . . . . . . . . . . 953.7.1. Asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953.7.2. Operadores matemticos . . . . . . . . . . . . . . . . . . . . . . 963.7.2.1. Introduccin a las macros del preprocesador . . . . . . 973.7.3. Operadores relacionales . . . . . . . . . . . . . . . . . . . . . . . 973.7.4. Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . 973.7.5. Operadores para bits . . . . . . . . . . . . . . . . . . . . . . . . . 983.7.6. Operadores de desplazamiento . . . . . . . . . . . . . . . . . . . 983.7.7. Operadores unarios . . . . . . . . . . . . . . . . . . . . . . . . . 1013.7.8. El operador ternario . . . . . . . . . . . . . . . . . . . . . . . . . 1023.7.9. El operador coma . . . . . . . . . . . . . . . . . . . . . . . . . . . 1023.7.10. Trampas habituales cuando se usan operadores . . . . . . . . . 1033.7.11. Operadores de moldeado . . . . . . . . . . . . . . . . . . . . . . 1033.7.12. Los moldes explcitos de C++ . . . . . . . . . . . . . . . . . . . . 1043.7.12.1. static_cast . . . . . . . . . . . . . . . . . . . . . . . 1053.7.12.2. const_cast . . . . . . . . . . . . . . . . . . . . . . . . 1063.7.12.3. reinterpret_cast . . . . . . . . . . . . . . . . . . . 1073.7.13. sizeof - un operador en si mismo . . . . . . . . . . . . . . . . . 1083.7.14. La palabra reservada asm . . . . . . . . . . . . . . . . . . . . . . 1083.7.15. Operadores explcitos . . . . . . . . . . . . . . . . . . . . . . . . 1093.8. Creacin de tipos compuestos . . . . . . . . . . . . . . . . . . . . . . . . 1093.8.1. Creacin de alias usando typedef . . . . . . . . . . . . . . . . . 1093.8.2. Usar struct para combinar variables . . . . . . . . . . . . . . 1103.8.2.1. Punteros y estructuras . . . . . . . . . . . . . . . . . . 112VIiiVolumen1 2012/1/12 13:52 page VII #7iiiiiindice general3.8.3. Programas ms claros gracias a enum . . . . . . . . . . . . . . . 1123.8.3.1. Comprobacin de tipos para enumerados . . . . . . . 1143.8.4. Cmo ahorrar memoria con union . . . . . . . . . . . . . . . . 1143.8.5. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1153.8.5.1. Punteros y arrays . . . . . . . . . . . . . . . . . . . . . 1173.8.5.2. El formato de punto flotante . . . . . . . . . . . . . . . 1203.8.5.3. Aritmtica de punteros . . . . . . . . . . . . . . . . . . 1213.9. Consejos para depuracin . . . . . . . . . . . . . . . . . . . . . . . . . . 1243.9.1. Banderas para depuracin . . . . . . . . . . . . . . . . . . . . . . 1243.9.1.1. Banderas de depuracin para el preprocesador . . . . 1243.9.1.2. Banderas para depuracin en tiempo de ejecucin . . 1243.9.2. Convertir variables y expresiones en cadenas . . . . . . . . . . . 1263.9.3. La macro C assert() . . . . . . . . . . . . . . . . . . . . . . . . . . 1263.10. Direcciones de funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273.10.1. Definicin de un puntero a funcin . . . . . . . . . . . . . . . . 1273.10.2. Declaraciones y definiciones complicadas . . . . . . . . . . . . . 1283.10.3. Uso de un puntero a funcin . . . . . . . . . . . . . . . . . . . . 1293.10.4. Arrays de punteros a funciones . . . . . . . . . . . . . . . . . . . 1293.11. Make: cmo hacer compilacin separada . . . . . . . . . . . . . . . . . 1303.11.1. Las actividades de Make . . . . . . . . . . . . . . . . . . . . . . . 1313.11.1.1. Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . 1323.11.1.2. Reglas de sufijo . . . . . . . . . . . . . . . . . . . . . . 1323.11.1.3. Objetivos predeterminados . . . . . . . . . . . . . . . . 1333.11.2. Los Makefiles de este libro . . . . . . . . . . . . . . . . . . . . . . 1343.11.3. Un ejemplo de Makefile . . . . . . . . . . . . . . . . . . . . . . . 1343.12. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1363.13. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1364. Abstraccin de Datos 1414.1. Una librera pequea al estilo C . . . . . . . . . . . . . . . . . . . . . . . 1424.1.1. Asignacin dinmica de memoria . . . . . . . . . . . . . . . . . 1454.1.2. Malas suposiciones . . . . . . . . . . . . . . . . . . . . . . . . . . 1484.2. Qu tiene de malo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1494.3. El objeto bsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1504.4. Qu es un objeto? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1564.5. Tipos abstractos de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1564.6. Detalles del objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1574.7. Conveciones para los ficheros de cabecera . . . . . . . . . . . . . . . . . 158VIIiiVolumen1 2012/1/12 13:52 page VIII #8iiiiiindice general4.7.1. Importancia de los ficheros de cabecera . . . . . . . . . . . . . . 1584.7.2. El problema de la declaracin mltiple . . . . . . . . . . . . . . 1604.7.3. Las directivas del preprocesador #define, #ifndef y #endif . . . 1604.7.4. Un estndar para los ficheros de cabecera . . . . . . . . . . . . . 1614.7.5. Espacios de nombres en los ficheros de cabecera . . . . . . . . . 1624.7.6. Uso de los ficheros de cabecera en proyectos . . . . . . . . . . . 1624.8. Estructuras anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1634.8.1. Resolucin de mbito global . . . . . . . . . . . . . . . . . . . . 1664.9. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1664.10. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1675. Ocultar la implementacin 1715.1. Establecer los lmites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1715.2. Control de acceso en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 1725.2.1. protected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1735.3. Amigos (friends) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1735.3.1. Amigas anidadas . . . . . . . . . . . . . . . . . . . . . . . . . . . 1755.3.2. Es eso puro? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1775.4. Capa de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1785.5. La clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1785.5.1. Modificaciones en Stash para usar control de acceso . . . . . . 1815.5.2. Modificar Stack para usar control de acceso . . . . . . . . . . . 1815.6. Manejo de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1825.6.1. Ocultar la implementacin . . . . . . . . . . . . . . . . . . . . . 1825.6.2. Reducir la recompilacin . . . . . . . . . . . . . . . . . . . . . . 1835.7. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1855.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1856. Inicializacin y limpieza 1876.1. Inicializacin garantizada por el constructor . . . . . . . . . . . . . . . 1886.2. Limpieza garantizada por el destructor . . . . . . . . . . . . . . . . . . 1896.3. Eliminacin del bloque de definiciones . . . . . . . . . . . . . . . . . . . 1916.3.1. Bucles for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1926.3.2. Alojamiento de memoria . . . . . . . . . . . . . . . . . . . . . . 1936.4. Stash con constructores y destructores . . . . . . . . . . . . . . . . . . . 1946.5. Stack con constructores y destructores . . . . . . . . . . . . . . . . . . . 1976.6. Inicializacin de tipos agregados . . . . . . . . . . . . . . . . . . . . . . 1996.7. Constructores por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . 2016.8. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202VIIIiiVolumen1 2012/1/12 13:52 page IX #9iiiiiindice general6.9. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2037. Sobrecarga de funciones y argumentos por defecto 2057.1. Ms decoracin de nombres . . . . . . . . . . . . . . . . . . . . . . . . . 2067.1.1. Sobrecarga en el valor de retorno . . . . . . . . . . . . . . . . . . 2077.1.2. Enlace con FIXME:tipos seguros . . . . . . . . . . . . . . . . . . 2077.2. Ejemplo de sobrecarga . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2087.3. Uniones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2117.4. Argumentos por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . . 2137.4.1. Argumentos de relleno . . . . . . . . . . . . . . . . . . . . . . . . 2147.5. Eleccin entre sobrecarga y argumentos por defecto . . . . . . . . . . . 2157.6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2197.7. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2208. Constantes 2238.1. Sustitucin de valores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2238.1.1. const en archivos de cabecera . . . . . . . . . . . . . . . . . . . 2248.1.2. constantes seguras . . . . . . . . . . . . . . . . . . . . . . . . . . 2258.1.3. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2268.1.4. Diferencias con C . . . . . . . . . . . . . . . . . . . . . . . . . . . 2268.2. Punteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2288.2.1. Puntero a constante . . . . . . . . . . . . . . . . . . . . . . . . . . 2288.2.2. Puntero constante . . . . . . . . . . . . . . . . . . . . . . . . . . . 2288.2.2.1. Formato . . . . . . . . . . . . . . . . . . . . . . . . . . . 2298.2.3. Asignacin y comprobacin de tipos . . . . . . . . . . . . . . . . 2298.2.3.1. Literales de cadena . . . . . . . . . . . . . . . . . . . . 2308.3. Argumentos de funciones y valores de retorno . . . . . . . . . . . . . . 2308.3.1. Paso por valor constante . . . . . . . . . . . . . . . . . . . . . . . 2318.3.2. Retorno por valor constante . . . . . . . . . . . . . . . . . . . . . 2318.3.2.1. Temporarios . . . . . . . . . . . . . . . . . . . . . . . . 2338.3.3. Paso y retorno de direcciones . . . . . . . . . . . . . . . . . . . . 2348.3.3.1. Criterio de paso de argumentos . . . . . . . . . . . . . 2358.4. Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2368.4.1. const en las clases . . . . . . . . . . . . . . . . . . . . . . . . . . 2378.4.1.1. La lista de inicializacin del constructor. . . . . . . . . 2378.4.1.2. Constructores para los tipos del lenguaje . . . . . . . . 2388.4.2. Constantes en tiempo de compilacin dentro de clases . . . . . 2398.4.2.1. El enumerado en codigo antiguo . . . . . . . . . . . . 2408.4.3. Objetos y mtodos constantes . . . . . . . . . . . . . . . . . . . . 241IXiiVolumen1 2012/1/12 13:52 page X #10iiiiiindice general8.4.3.1. mutable: constancia binaria vs. lgica . . . . . . . . . . 2448.4.3.2. ROMability . . . . . . . . . . . . . . . . . . . . . . . . . 2458.5. Volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2458.6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2478.7. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2479. Funciones inline 2519.1. Los peligros del preprocesador . . . . . . . . . . . . . . . . . . . . . . . 2519.1.1. Macros y acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2549.2. Funciones inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2549.2.1. inline dentro de clases . . . . . . . . . . . . . . . . . . . . . . . . 2559.2.2. Funciones de acceso . . . . . . . . . . . . . . . . . . . . . . . . . 2569.2.2.1. Accesores y mutadores . . . . . . . . . . . . . . . . . . 2579.3. Stash y Stack con inlines . . . . . . . . . . . . . . . . . . . . . . . . . . . 2619.4. Funciones inline y el compilador . . . . . . . . . . . . . . . . . . . . . . 2649.4.1. Limitaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2659.4.2. Referencias adelantadas . . . . . . . . . . . . . . . . . . . . . . . 2659.4.3. Actividades ocultas en contructores y destructores . . . . . . . . 2669.5. Reducir el desorden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2679.6. Ms caractersticas del preprocesador . . . . . . . . . . . . . . . . . . . 2689.6.1. Encolado de smbolos . . . . . . . . . . . . . . . . . . . . . . . . 2699.7. Comprobacin de errores mejorada . . . . . . . . . . . . . . . . . . . . . 2699.8. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2729.9. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27210. Control de nombres 27510.1. Los elementos estticos de C . . . . . . . . . . . . . . . . . . . . . . . . . 27510.1.1. Variables estticas dentro de funciones . . . . . . . . . . . . . . 27510.1.1.1. Objetos estticos dentro de funciones . . . . . . . . . . 27710.1.1.2. Destructores de objetos estticos . . . . . . . . . . . . . 27710.1.2. Control del enlazado . . . . . . . . . . . . . . . . . . . . . . . . . 27910.1.2.1. Confusin . . . . . . . . . . . . . . . . . . . . . . . . . . 28010.1.3. Otros especificadores para almacenamiento de clases . . . . . . 28110.2. Espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28110.2.1. Crear un espacio de nombres . . . . . . . . . . . . . . . . . . . . 28110.2.1.1. Espacios de nombres sin nombre . . . . . . . . . . . . 28210.2.1.2. Amigas . . . . . . . . . . . . . . . . . . . . . . . . . . . 28310.2.2. Cmo usar un espacio de nombres . . . . . . . . . . . . . . . . . 28310.2.2.1. Resolucin del mbito . . . . . . . . . . . . . . . . . . . 283XiiVolumen1 2012/1/12 13:52 page XI #11iiiiiindice general10.2.2.2. La directiva using . . . . . . . . . . . . . . . . . . . . 28410.2.2.3. La declaracin using . . . . . . . . . . . . . . . . . . . 28610.2.3. El uso de los espacios de nombres . . . . . . . . . . . . . . . . . 28710.3. Miembros estticos en C++ . . . . . . . . . . . . . . . . . . . . . . . . . 28710.3.1. Definicin del almacenamiento para atributos estticos . . . . . 28810.3.1.1. Inicializacin de vectores estticos . . . . . . . . . . . . 28910.3.2. Clases anidadas y locales . . . . . . . . . . . . . . . . . . . . . . 29110.3.3. Mtodos estticos . . . . . . . . . . . . . . . . . . . . . . . . . . . 29210.4. Dependencia en la inicializacin de variables estticas . . . . . . . . . . 29410.4.1. Qu hacer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29610.4.1.1. Tcnica uno . . . . . . . . . . . . . . . . . . . . . . . . . 29610.4.1.2. Tcnica dos . . . . . . . . . . . . . . . . . . . . . . . . . 29810.5. Especificaciones de enlazado alternativo . . . . . . . . . . . . . . . . . . 30210.6. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30210.7. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30311. Las referencias y el constructor de copia 30711.1. Punteros en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30711.2. Referencias en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30811.2.1. Referencias en las funciones . . . . . . . . . . . . . . . . . . . . . 30811.2.1.1. Referencias constantes . . . . . . . . . . . . . . . . . . 30911.2.1.2. Referencias a puntero . . . . . . . . . . . . . . . . . . . 31011.2.2. Consejos para el paso de argumentos . . . . . . . . . . . . . . . 31111.3. El constructor de copia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31111.3.1. Paso y retorno por valor . . . . . . . . . . . . . . . . . . . . . . . 31111.3.1.1. Paso y retorno de objetos grandes . . . . . . . . . . . . 31211.3.1.2. Marco de pila para llamadas a funcin . . . . . . . . . 31311.3.1.3. Re-entrada . . . . . . . . . . . . . . . . . . . . . . . . . 31311.3.1.4. Copia bit a bit vs. inicializacin . . . . . . . . . . . . . 31411.3.2. Construccin por copia . . . . . . . . . . . . . . . . . . . . . . . 31611.3.2.1. Objetos temporales . . . . . . . . . . . . . . . . . . . . 32011.3.3. El constructor de copia por defecto . . . . . . . . . . . . . . . . . 32011.3.4. Alternativas a la construccin por copia . . . . . . . . . . . . . . 32211.3.4.1. Evitando el paso por valor . . . . . . . . . . . . . . . . 32211.3.4.2. Funciones que modifican objetos externos . . . . . . . 32311.4. Punteros a miembros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32311.4.1. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32511.4.1.1. Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . 326XIiiVolumen1 2012/1/12 13:52 page XII #12iiiiiindice general11.5. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32711.6. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32812. Sobrecarga de operadores 33112.1. Precaucin y tranquilidad . . . . . . . . . . . . . . . . . . . . . . . . . . 33112.2. Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33212.3. Operadores sobrecargables . . . . . . . . . . . . . . . . . . . . . . . . . 33312.3.1. Operadores unarios . . . . . . . . . . . . . . . . . . . . . . . . . 33312.3.1.1. Incremento y decremento . . . . . . . . . . . . . . . . . 33612.3.2. Operadores binarios . . . . . . . . . . . . . . . . . . . . . . . . . 33712.3.3. Argumentos y valores de retorno . . . . . . . . . . . . . . . . . . 34612.3.3.1. Retorno por valor como constante . . . . . . . . . . . . 34712.3.3.2. Optimizacin del retorno . . . . . . . . . . . . . . . . . 34712.3.4. Operadores poco usuales . . . . . . . . . . . . . . . . . . . . . . 34812.3.4.1. El operador coma . . . . . . . . . . . . . . . . . . . . . 34812.3.4.2. El operador -> . . . . . . . . . . . . . . . . . . . . . . . 34912.3.4.3. Un operador anidado . . . . . . . . . . . . . . . . . . . 35112.3.4.4. Operador ->* . . . . . . . . . . . . . . . . . . . . . . . . 35212.3.5. Operadores que no puede sobrecargar . . . . . . . . . . . . . . . 35412.4. Operadores no miembros . . . . . . . . . . . . . . . . . . . . . . . . . . 35512.4.1. Directrices bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . 35612.5. Sobrecargar la asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . 35712.5.1. Comportamiento del operador = . . . . . . . . . . . . . . . . . 35812.5.1.1. Punteros en clases . . . . . . . . . . . . . . . . . . . . . 35912.5.1.2. Contabilidad de referencias . . . . . . . . . . . . . . . 36112.5.1.3. Creacin automtica del operador = . . . . . . . . . . 36512.6. Conversin automtica de tipos . . . . . . . . . . . . . . . . . . . . . . . 36612.6.1. Conversin por constructor . . . . . . . . . . . . . . . . . . . . . 36612.6.1.1. Evitar la conversin por constructor . . . . . . . . . . . 36712.6.2. Conversin por operador . . . . . . . . . . . . . . . . . . . . . . 36812.6.2.1. Reflexividad . . . . . . . . . . . . . . . . . . . . . . . . 36812.6.3. Ejemplo de conversin de tipos . . . . . . . . . . . . . . . . . . . 37012.6.4. Las trampas de la conversin automtica de tipos . . . . . . . . 37112.6.4.1. Actividades ocultas . . . . . . . . . . . . . . . . . . . . 37212.7. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37312.8. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37313. Creacin dinmica de objetos 37713.1. Creacin de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378XIIiiVolumen1 2012/1/12 13:52 page XIII #13iiiiiindice general13.1.1. Asignacin dinmica en C . . . . . . . . . . . . . . . . . . . . . . 37813.1.2. El operador new . . . . . . . . . . . . . . . . . . . . . . . . . . . 38013.1.3. El operador delete . . . . . . . . . . . . . . . . . . . . . . . . . 38013.1.4. Un ejemplo sencillo . . . . . . . . . . . . . . . . . . . . . . . . . . 38113.1.5. Trabajo extra para el gestor de memoria . . . . . . . . . . . . . . 38113.2. Rediseo de los ejemplos anteriores . . . . . . . . . . . . . . . . . . . . 38213.2.1. delete void* probablemente es un error . . . . . . . . . . . . . 38213.2.2. Responsabilidad de la limpieza cuando se usan punteros . . . . 38313.2.3. Stash para punteros . . . . . . . . . . . . . . . . . . . . . . . . . 38413.2.3.1. Una prueba . . . . . . . . . . . . . . . . . . . . . . . . . 38613.3. new y delete para vectores . . . . . . . . . . . . . . . . . . . . . . . . 38813.3.1. Cmo hacer que un puntero sea ms parecido a un vector . . . 38913.3.2. Cuando se supera el espacio de almacenamiento . . . . . . . . . 38913.3.3. Sobrecarga de los operadores new y delete . . . . . . . . . . . 39013.3.3.1. Sobrecarga global de new y delete . . . . . . . . . . . 39113.3.3.2. Sobrecarga de new y delete especfica para una cla-se . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39313.3.3.3. Sobrecarga de new y delete para vectores . . . . . . 39513.3.3.4. Llamadas al constructor . . . . . . . . . . . . . . . . . . 39713.3.3.5. Operadoresnewydeletede[FIXMEemplazamien-to (situacin)] . . . . . . . . . . . . . . . . . . . . . . . 39813.4. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40013.5. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40014. Herencia y Composicin 40314.1. Sintaxis de la composicin . . . . . . . . . . . . . . . . . . . . . . . . . . 40314.2. Sintaxis de la herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40514.3. Lista de inicializadores de un constructor . . . . . . . . . . . . . . . . . 40614.3.1. Inicializacin de objetos miembros . . . . . . . . . . . . . . . . . 40714.3.2. Tipos predefinidos en la lista de inicializadores . . . . . . . . . . 40714.3.3. Combinacin de composicin y herencia . . . . . . . . . . . . . 40814.3.3.1. Llamadas automticas al destructor . . . . . . . . . . 40914.3.4. Orden de llamada de constructores y destructores . . . . . . . . 40914.4. Ocultacin de nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41114.5. Funciones que no heredan automticamente . . . . . . . . . . . . . . . 41414.5.1. Herencia y mtodos estticos . . . . . . . . . . . . . . . . . . . . 41714.5.2. Composicin vs. herencia . . . . . . . . . . . . . . . . . . . . . . 41714.5.2.1. Subtipado . . . . . . . . . . . . . . . . . . . . . . . . . . 41914.5.2.2. Herencia privada . . . . . . . . . . . . . . . . . . . . . 421XIIIiiVolumen1 2012/1/12 13:52 page XIV #14iiiiiindice general14.5.2.2.1. Publicar los miembros heredados de formaprivada . . . . . . . . . . . . . . . . . . . . . . 42114.6. Protected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42214.6.1. Herencia protegida . . . . . . . . . . . . . . . . . . . . . . . . . . 42214.7. Herencia y sobrecarga de operadores . . . . . . . . . . . . . . . . . . . . 42314.8. Herencia mltiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42414.9. Desarrollo incremental . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42414.10.Upcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42514.10.1.Por qu upcasting? . . . . . . . . . . . . . . . . . . . . . . . . 42614.10.2.FIXME Upcasting y el constructor de copia . . . . . . . . . . . . 42614.10.3.Composicin vs. herencia FIXME (revisited) . . . . . . . . . . . 42914.10.4.FIXME Upcasting de punteros y referencias . . . . . . . . . . . . 43014.10.5.Una crisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43014.11.Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43114.12.Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43115. Polimorfismo y Funciones virtuales 43515.1. Evolucin de los programadores de C++ . . . . . . . . . . . . . . . . . . 43515.2. Upcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43615.3. El problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43715.3.1. Ligadura de las llamadas a funciones . . . . . . . . . . . . . . . 43715.4. Funciones virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43815.4.1. Extensibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43915.5. Cmo implementa C++ la ligadura dinmica . . . . . . . . . . . . . . . 44115.5.1. Almacenando informacin de tipo . . . . . . . . . . . . . . . . . 44215.5.2. Pintar funciones virtuales . . . . . . . . . . . . . . . . . . . . . . 44315.5.3. Detrs del teln . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44515.5.4. Instalar el vpointer . . . . . . . . . . . . . . . . . . . . . . . . . . 44615.5.5. Los objetos son diferentes . . . . . . . . . . . . . . . . . . . . . . 44615.6. Por qu funciones virtuales? . . . . . . . . . . . . . . . . . . . . . . . . 44715.7. Clases base abstractas y funciones virtuales puras . . . . . . . . . . . . 44815.7.1. Definiciones virtuales puras . . . . . . . . . . . . . . . . . . . . . 45215.8. Herencia y la VTABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45315.8.1. FIXME: Object slicing . . . . . . . . . . . . . . . . . . . . . . . . 45515.9. Sobrecargar y redefinir . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45715.9.1. Tipo de retorno variante . . . . . . . . . . . . . . . . . . . . . . . 45815.10.funciones virtuales y constructores . . . . . . . . . . . . . . . . . . . . . 46015.10.1.Orden de las llamadas a los constructores . . . . . . . . . . . . . 460XIViiVolumen1 2012/1/12 13:52 page XV #15iiiiiindice general15.10.2.Comportamiento de las funciones virtuales dentro de los cons-tructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46115.10.3.Destructores y destructores virtuales . . . . . . . . . . . . . . . . 46215.10.4.Destructores virtuales puros . . . . . . . . . . . . . . . . . . . . 46315.10.5.Mecanismo virtual en los destructores . . . . . . . . . . . . . . . 46515.10.6.Creacin una jerarqua basada en objetos . . . . . . . . . . . . . 46615.11.Sobrecarga de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . 46915.12.Downcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47115.13.Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47315.14.Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47416. Introduccin a las Plantillas 47916.1. Contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47916.1.1. La necesidad de los contenedores . . . . . . . . . . . . . . . . . 48116.2. Un vistazo a las plantillas . . . . . . . . . . . . . . . . . . . . . . . . . . 48116.2.1. La solucin de la plantilla . . . . . . . . . . . . . . . . . . . . . . 48316.3. Sintaxis del Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48416.3.1. Definiciones de funcin no inline . . . . . . . . . . . . . . . . . . 48616.3.1.1. Archivos cabecera . . . . . . . . . . . . . . . . . . . . . 48616.3.2. IntStack como plantilla . . . . . . . . . . . . . . . . . . . . . . . . 48716.3.3. Constantes en los Templates . . . . . . . . . . . . . . . . . . . . . 48816.4. Stack y Stash como Plantillas . . . . . . . . . . . . . . . . . . . . . . . . 49016.4.1. Cola de punteros mediante plantillas . . . . . . . . . . . . . . . 49216.5. Activando y desactivando la propiedad . . . . . . . . . . . . . . . . . . 49616.6. Manejando objetos por valor . . . . . . . . . . . . . . . . . . . . . . . . . 49816.7. Introduccin a los iteradores . . . . . . . . . . . . . . . . . . . . . . . . . 50016.7.1. Stack con iteradores . . . . . . . . . . . . . . . . . . . . . . . . . 50716.7.2. PStash con iteradores . . . . . . . . . . . . . . . . . . . . . . . . . 51016.8. Por qu usar iteradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51516.8.1. Plantillas Funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . 51716.9. Resumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51816.10.Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519A. Estilo de codificacin 523A.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523A.2. Nombres de fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524A.3. Marcas comentadas de inicio y fin . . . . . . . . . . . . . . . . . . . . . 524A.4. Parntesis, llaves e indentacin . . . . . . . . . . . . . . . . . . . . . . . 525A.5. Nombres para identificadores . . . . . . . . . . . . . . . . . . . . . . . . 528XViiVolumen1 2012/1/12 13:52 page XVI #16iiiiiindice generalA.6. Orden de los #includes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529A.7. Guardas de inclusin en ficheros de cabecera . . . . . . . . . . . . . . . 529A.8. Uso de los espacios de nombres . . . . . . . . . . . . . . . . . . . . . . . 529A.9. Utilizacin de require() y assure() . . . . . . . . . . . . . . . . . 530B. Directrices de Programacin 531C. Lecturas recomendadas 541C.1. Sobre C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541C.2. Sobre C++ en general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541C.2.1. Mi propia lista de libros . . . . . . . . . . . . . . . . . . . . . . . 541C.3. Los rincones oscuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542C.4. Sobre Anlisis y Diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . 543XVIiiVolumen1 2012/1/12 13:52 page XVII #17iiiiiindice de figuras1. Introduccin a los Objetos1.1. Clase Luz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.2. Un coche tiene un motor . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3. subclases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.4. Jerarqua de Figura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.5. Especializacin de Figura . . . . . . . . . . . . . . . . . . . . . . . . . 91.6. Reescritura de mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.7. Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.8. Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.9. Upcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.10. Diagramas de casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . 201.11. Un ejemplo de caso de uso . . . . . . . . . . . . . . . . . . . . . . . . . . 2111. Las referencias y el constructor de copia11.1. Llamada a una funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31314. Herencia y Composicin14.1. Upcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42615. Polimorfismo y Funciones virtuales15.1. Funciones virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44315.2. Tabla de punteros virtuales . . . . . . . . . . . . . . . . . . . . . . . . . 44415.3. Clase abstracta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44915.4. Una nueva funcin virtual . . . . . . . . . . . . . . . . . . . . . . . . . . 45415.5. Object slicing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45616. Introduccin a las Plantillas16.1. Contenedores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483XVIIiiVolumen1 2012/1/12 13:52 page XVIII #18iiiiiindice de figuras16.2. Herencia mltiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48316.3. Contenedor de objetos Figura . . . . . . . . . . . . . . . . . . . . . . . 484XVIIIiiVolumen1 2012/1/12 13:52 page XIX #19iiiiiindice de cuadros3. C en C++3.1. Expresiones que utilizan booleanos . . . . . . . . . . . . . . . . . . . . . 773.2. Moldes explcitos de C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 1053.3. Nuevas palabras reservadas para operadores booleanos . . . . . . . . . 10912. Sobrecarga de operadores12.1. Directrices para elegir entre miembro y no-miembro . . . . . . . . . . . 357XIXiiVolumen1 2012/1/12 13:52 page XX #20iiiiiiiiVolumen1 2012/1/12 13:52 page XXI #21iiiiiiPrlogo a la traduccinEste trabajo de traduccin ha sido realizado ntegramente por voluntarios. Leagradecemos que nos comunique cualquier error de traduccin o transcripcin en eltexto. Tambin ser bienvenido si desea colaborar ms activamente en la traduccin.Aydenos a hacer de esta traduccin un trabajo de calidad.Si desea saber ms sobre este proyecto, obtener el segundo volumen, colaborarenviando informes de fallos, traduciendo o revisando, etc. visite la pgina web 1 onuestro grupo Google 2 .El trabajo de traduccin de este volumen prcticamente ha terminado, pero esposible que todava queden muchos errores debido a que la revisin es trabajosay contamos con pocos voluntarios. Le agradecemos su colaboracin para corregirposibles erratas o fallos de cualquier tipo. En todo caso, el libro est completo y esperfectamente til en su estado actual.Este prlogo no forma parte del libro original y ha sido incluido como resea yreferencia de los trabajos de traduccin que se han llevado a cabo. Este captulo nolo dar por terminado hasta que concluya el proceso de traduccin y revisin de estevolumen al menos. La traduccin del Volumen 2 ya est en marcha.Licencia y normas de distribucinEl equipo de traduccin ha seguido al pi de la letra las directrices marcadas porBruce Eckel, autor de Thinking in C++ (el libro original), para la realizacin de tra-ducciones y distribucin de stas. Si utiliza o distribuye este texto debe cumplirlas yadvertir de su existencia a los posibles lectores. El equipo de traduccin elude todaresponsabilidad por la violacin (por parte de terceros) de las citadas directrices 3 . Seincluyen a continuacin respetando el idioma original para evitar eventuales inter-pretaciones incorrectas:In my contract with the publisher, I maintain all electronic publishingrightstothebook,includingtranslationintoforeignlanguages.Thismeansthat the publisher still handles negotiations for translations that are prin-ted (and I have nothing directly to do with that) but I may grant transla-tion rights for electronic versions of the book.I have been granting such rights for open-source style translation pro-jects. (Note that I still maintain the copyright on my material.) That is:You must provide a web site or other medium whereby people may1http://arco.esi.uclm.es/~david.villa/pensarC++.html2http://groups.google.com/group/pensar-en-cpp3El texto original de estas directrices est accesible en la pgina web del autor.XXIiiVolumen1 2012/1/12 13:52 page XXII #22iiiiiiPrlogo a la traduccinparticipateintheproject(twoeasypossibilitiesarehttp://www.egroups.comor http://www.topica.com).You must maintain a downloadable version of the partially or fullytranslated version of the book.Someone must be responsible for the organization of the translation(I cannot be actively involved - I dont have the time).There should only be one language translation project for each book.We dont have the resources for a fork.As in an open-source project, there must be a way to pass responsi-bility to someone else if the first person becomes too busy.The book must be freely distributable.The book may be mirrored on other sites.Names of the translators should be included in the translated book.TecnicismosSe han traducido la mayor parte de los trminos especficos tanto de orientacin aobjetos como de programacin en general. Para evitar confusiones o ambigedadesa los lectores que manejen literatura en ingls hemos incluido entre parntesis eltrmino original la primera vez que aparece traducido.Para traducir tecnicismos especialmente complicados hemos utilizado como refe-rencia la segunda edicin de El lenguaje de Programacin C++ (en castellano) as comola Wikipedia.En contadas ocasiones se ha mantenido el trmino original en ingls. En benefi-cio de la legibilidad, hemos preferido no hacer traducciones demasiado forzadas niutilizar expresiones que pudieran resultar desconocidas en el argot o en los librosespecializados disponibles en castellano. Nuestro propsito es tener un libro quepueda ser comprendido por hispano-hablantes. Es a todas luces imposible realizaruna traduccin rigurosa acorde con las normas lingsticas de la RAE, puesto que,en algunos casos, el autor incluso utiliza palabras de su propia invencin.Cdigo fuentePor hacerProduccinTodo el proceso de traduccin, edicin, formato y tipografa ha sido realizadontegramente con software libre. Todo el software utilizado est disponible en la dis-tribucin Debian GNU/Linux, que es la que se ha utilizado principalmente para laactualizacin y mantenimiento de los documentos obtenidos como resultado.El texto ha sido escrito en el lenguaje de marcado DocBook versin 4.5 en suvariante XML. Cada captulo est contenido en un fichero independiente y todosellos se incluyen en un fichero maestro utilizando XInclude.Debido a que muchos procesadores de DocBook no soportan adecuadamente lacaracterstica XInclude, se usa la herramienta xsltproc 4 para generar un nico fiche-4http://xmlsoft.org/XSLT/xsltproc2.htmlXXIIiiVolumen1 2012/1/12 13:52 page XXIII #23iiiiiiProduccinro XML que contiene el texto de todo el libro, y es ese fichero resultante el que seprocesa.Cdigo fuenteTambin se utiliza XInclude para aadir en su lugar el contenido de los ficherosde cdigo fuente escritos en C++. De ese modo, el texto de los listados que aparecenen el libro es idntico a los ficheros C++ que distribuye el autor. De ese modo, laedicin es mucha ms limpia y sobretodo se evitan posibles errores de transcripcinde los listados.Utilizando un pequeo programa escrito en lenguaje Python 5 , se substituyen losnombres etiquetados de los ficheros por la sentencia XInclude correspondiente://: V1C02:Hello.cpppasa a ser:

C02/Hello.cpp

Una ver realizada esta substitucin, se utiliza de nuevo xsltproc para montartanto el texto como los listados en un nico fichero XML.Convenciones tipogrficasPalabras reservadas: structCdigo fuente: printf("Hello world");Nombres de ficheros: fichero.cppAplicacin o fichero binario: makeEntrecomillado: upcastingEsquemas y diagramasLos dibujos y diagramas originales se han rehecho en formato .svg usando laherramienta inkscape 6 . A partir del fichero fuente .svg se generan versiones enformato .png para la versin HTML y .pdf para la versin PDF.Generacin de productosA partir del documento completo en formato DocBook se generan dos resultadosdistintos;5./utils/fix_includes.py6http://inkscape.org/XXIIIiiVolumen1 2012/1/12 13:52 page XXIV #24iiiiiiPrlogo a la traduccinHTML en una sola pgina Una pgina web XHTML. Para ello se utiliza tambin laherramienta xsltproc aplicando hojas de estilo XSLT que pueden encontrarseen el repositorio de fuentes del proyecto. Estas plantillas son modificacionesde las del proyecto de documentacin del programa The Gimp, que tienenlicencia GPL.Para el coloreado de los listados de cdigo fuente se ha utilizado el programahighlight. Para ello, un pequeo programa Python marca los listados para suextraccin, a continuacin se colorean y por ltimo se vuelven a insertar en lapgina HTML.HTML (una pgina por seccin) UnconjuntodepginasXHTML.Automticamen-te se generan enlaces para navegar por el documento y tablas de contenidos.PDF Un documento en formato PDF utilizando la aplicacin dblatex 7 . Ha sido ne-cesario crear una hoja de estilo especficamente para manipular el formato depgina,ttulosendices.Paraelresaltedesintaxisdeloslistadossehautilizadoel paquete LaTeX listings.El equipoLas siguientes personas han colaborado en mayor o menor medida en algn mo-mento desde el comienzo del proyecto de traduccin de Pensar en C++:David Villa Alises (coordinador) dvilla#gmx.netMguel ngel Garca miguelangel.garcia#gmail.comJavier Corrales Garca jcg#damir.iem.csic.esBrbara Teruggi bwire.red#gmail.comSebastin GurinGloria Barbern Gonzlez globargon#gmail.comFernando Perfumo Velzquez nperfumo#telefonica.netJos Mara Gmez josemaria.gomez#gmail.comDavid Martnez Moreno ender#debian.orgCristbal Tello ctg#tinet.orgJess Lpez Mollo (pre-Lucas)Jos Mara Requena Lpez (pre-Lucas)Javier Fenoll Rejas (pre-Lucas)AgradecimientosPor hacer: LuCAS, [email protected], [email protected]://dblatex.sourceforge.net/XXIViiVolumen1 2012/1/12 13:52 page XXV #25iiiiiiPrefacioComo cualquier lenguaje humano, C++ proporciona mtodos pa-ra expresar conceptos. Si se utiliza de forma correcta, este medio deexpresin ser significativamente ms sencillo y flexible que otrasalternativas cuando los problemas aumentan en tamao y compleji-dad.No se puede ver C++ slo como un conjunto de caractersticas, ya que algunasde esas caractersticas no tienen sentido por separado. Slo se puede utilizar la sumade las partes si se est pensando en el diseo, no slo en el cdigo. Y para entenderC++ de esta forma, se deben comprender los problemas existentes con C y con laprogramacin en general. Este libro trata los problemas de programacin, porqueson problemas, y el enfoque que tiene C++ para solucionarlos. Adems, el conjuntode caractersticas que explico en cada captulo se basar en la forma en que yo veoun tipo de problema en particular y cmo resolverlo con el lenguaje. De esta formaespero llevar al lector, poco a poco, de entender C al punto en el que C++ se conviertaen su propia lengua.Durante todo el libro, mi actitud ser pensar que el lector desea construir en sucabeza un modelo que le permita comprender el lenguaje bajando hasta sus races;si se tropieza con un rompecabezas, ser capaz de compararlo con su modelo mentaly deducir la respuesta. Tratar de comunicarle las percepciones que han reorientadomi cerebro para Pensar en C++.Material nuevo en la segunda edicinEste libro es una minuciosa reescritura de la primera edicin para reflejar todoslos cambios que han aparecido en C++ tras la finalizacin del estndar que lo rige,y tambin para reflejar lo que he aprendido desde que escrib la primera edicin.He examinado y reescrito el texto completo, en ocasiones quitando viejos ejemplos,a veces cambindolos, y tambin aadiendo muchos ejercicios nuevos. La reorga-nizacin y reordenacin del material tuvo lugar para reflejar la disponibilidad demejores herramientas, as como mi mejor comprensin de cmo la gente aprendeC++. He aadido un nuevo captulo, como introduccin al resto del libro, una in-troduccin rpida a los conceptos de C y a las caractersticas bsicas de C++ paraaquellos que no tienen experiencia en C. El CD-ROM incluido al final del libro en laedicin en papel contiene un seminario: una introduccin an ms ligera a los con-ceptos de C necesarios para comprender C++ (o Java). Chuck Allison lo escribi parami empresa (MindView, Inc.), y se llama Pensar en C: conceptos bsicos de Java yC++. Presenta los aspectos de C que necesita conocer para poder cambiar a C++ oJava, abandonando los desagradables bits de bajo nivel con los que los programa-dores de C tratan a diario, pero que lenguajes como C++ y Java mantienen lejos (oXXViiVolumen1 2012/1/12 13:52 page XXVI #26iiiiiiPrefacioincluso eliminan, en el caso de Java).As que la respuesta corta a la pregunta Qu es diferente en la segunda edi-cin? sera que aquello que no es completamente nuevo se ha reescrito, a veceshasta el punto en el que no podra reconocer los ejemplos y el material original de laprimera edicin.Qu contiene el volumen 2 de este libro?ConlaconclusindelestndardeC++tambinseaadieronalgunasimportantesbibliotecas nuevas, tales como string y los contenedores, y algoritmos de la LibreraEstndar C++, y tambin se ha aadido complejidad a las plantillas. stos y otrostemas ms avanzados se han relegado al volumen 2 de este libro, incluyendo asuntoscomo la herencia mltiple, el manejo de excepciones, patrones de diseo, y materialsobre la creacin y depuracin de sistemas estables.Cmo obtener el volumen 2Del mismo modo que el libro que lee en estos momentos, Pensar en C++, Volumen2 se puede descargar desde mi sitio web www.BruceEckel.com. Puede encontrar in-formacin en el sitio web sobre la fecha prevista para la impresin del Volumen 2.El sitio web tambin contiene el cdigo fuente de los listados para ambos libros,juntoconactualizacioneseinformacinsobreotrosseminariosenCD-ROMqueofre-ce MidView Inc., seminarios pblicos y formacin interna, consultas, soporte y asis-tentes paso a paso.RequisitosEn la primera edicin de este libro, decid suponer que otra persona ya le habaenseado C y que el lector tena, al menos, un nivel aceptable de lectura del mismo.Mi primera intencin fue hablar de lo que me result difcil: el lenguaje C++. Enesta edicin he aadido un captulo como introduccin rpida a C, acompaada delseminario en-CD Thinking in C, pero sigo asumiendo que el lector tiene algn tipode experiencia en programacin. Adems, delmismo modo que se aprenden muchaspalabras nuevas intuitivamente, vindolas en el contexto de una novela, es posibleaprender mucho sobre C por el contexto en el que se utiliza en el resto del libro.Aprender C++Yo me adentr en C++ exactamente desde la misma posicin en la que espero quese encuentren muchos de los lectores de este libro: como un programador con unaactitud muy sensata y con muchos vicios de programacin. Peor an, mi experienciaera sobre porgramacin de sistemas empotrados a nivel hardware, en la que a ve-ces se considera a C como un lenguaje de alto nivel y excesivamente ineficiente paraahorrar bits. Descubr ms tarde que nunca haba sido un buen programador en C,camuflando as mi ignorancia sobre estructuras, malloc() y free(), setjmp()y longjmp(), y otros conceptos sofisticados, y murindome de vergenza cuandoestos trminos entraban en una conversacin, en lugar de investigar su utilidad.Cuando comenc mi lucha por aprender C++, el nico libro decente era la au