Actualizado el 22 de Febrero del 2018 (Publicado el 31 de Agosto del 2017)
8.075 visualizaciones desde el 31 de Agosto del 2017
2,9 MB
358 paginas
Creado hace 13a (12/01/2012)
i
i
“Volumen2” — 2012/1/12 — 13:53 — page I — #1
i
i
Pensar en C++ (Volumen 2)
Traducción (INACABADA) del libro Thinking in C++, Volumen 2
Bruce Eckel
12 de enero de 2012
Puede encontrar la versión actualizada de este libro e información adicional sobre el proyecto de traducción en
http://arco.esi.uclm.es/~david.villa/pensarC++.html
i
i
i
i
i
i
“Volumen2” — 2012/1/12 — 13:53 — page II — #2
i
i
Pensar en C++ (Volumen 2)
by Bruce Eckel
Copyright © 2004 Bruce Eckel
II
i
i
i
i
i
i
“Volumen2” — 2012/1/12 — 13:53 — page III — #3
i
i
Índice general
1. Introducción
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
. .
1.3.1. Soluciones de los ejercicios
1.1. Objetivos .
1.2. Capítulos .
1.3. Ejercicios .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4. Código fuente .
1.5. Compiladores .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6. Estándares del lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.7. Seminarios, CD-ROMs y consultoría . . . . . . . . . . . . . . . . . . . .
. .
1.8. Errores .
.
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.9. Sobre la portada .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
1.10. Agradecimientos
.
.
.
.
.
.
I Construcción de Sistemas estables
1
1
2
3
4
4
4
5
5
6
6
6
9
2. Tratamiento de excepciones
. . .
. . . . . . .
13
2.1. Tratamiento tradicional de errores
. . . . . . . . . . . . . . . . . . . . . 13
2.2. Lanzar una excepción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3. Capturar una excepción . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.1. El bloque try . . . .
. . . . . . . . . . . . . . . 15
2.3.2. Manejadores de excepción . . . . . . . . . . . . . . . . . . . . . . 16
2.3.3.
. . . . . . . . . . . . . . . . . . . . . . . . . 16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
.
2.4.1. Capturar cualquier excepción . . . . . . . . . . . . . . . . . . . . 17
2.4.2. Relanzar una excepción . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.3. Excepciones no capturadas . . . . . . . . . . . . . . . . . . . . . 18
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.1. Gestión de recursos . . . . . . . . . . . . . . . . . . . . . . . . . . 19
. . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.2.
2.5. Limpieza .
. . .
.
. . . .
. . .
2.4.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
i
i
III
i
i
i
i
Índice general
“Volumen2” — 2012/1/12 — 13:53 — page IV — #4
i
i
.
.
.
.
.
. . .
. . . . . .
¿Mejores especificaciones de excepciones?
2.5.3. auto_ptr .
2.5.4. Bloques try a nivel de función . . .
. . . . . . . . . . . . . . . . . 22
. . . . . . . . . . . . . . . . 22
2.6. Excepciones estándar .
. . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.7. Especificaciones de excepciones . . . . . . . . . . . . . . . . . . . . . . . 24
. . . . . . . . . . . . 25
2.7.1.
2.7.2. Especificación de excepciones y herencia . . . . . . . . . . . . . 26
2.7.3. Cuándo no usar especificaciones de excepción . . . . . . . . . . 26
2.8. Seguridad de la excepción . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.9. Programar con excepciones . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.9.1. Cuándo evitar las excepciones
. . . . . . . . . . . . . . . . . . . 28
2.9.2. Usos típicos de excepciones . . . . . . . . . . . . . . . . . . . . . 28
. . . . . . . . . . . . . . . . . . . . . . . . . . . 28
. . . . . . . . . . . . . . . . . . . . . . . . . . . 29
. . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.10. Sobrecarga .
.
2.11. Resumen .
2.12. Ejercicios .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3. Programación defensiva
.
31
. . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.1. Aserciones .
3.2. Un framework de pruebas unitarias sencillo . . . . . . . . . . . . . . . 35
3.2.1. Pruebas automatizadas . . . . . . . . . . . . . . . . . . . . . . . 37
3.2.2. El Framework TestSuite . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.3. Suites de test
. . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2.4. El código del framework de prueba . . . . . . . . . . . . . . . . 43
3.3. Técnicas de depuración . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.3.1. Macros de seguimiento . . . . . . . . . . . . . . . . . . . . . . . 48
. . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.3.2. Fichero de rastro .
3.3.3. Encontrar agujeros en memoria
. . . . . . . . . . . . . . . . . . 50
. . . . . . . . . . . . . . . . . . . . . . . . . . . 55
. . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.4. Resumen .
3.5. Ejercicios .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
II La librería Estándar de C++
57
4. Las cadenas a fondo
.
. . .
. . . . . .
61
4.1. ¿Qué es un string? .
. . . . . . . . . . . . . . . . . . 61
4.2. Operaciones con cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.2.1. Añadiendo, insertando y concatenando cadenas . . . . . . . . . 63
4.2.2. Reemplazar caracteres en cadenas . . . . . . . . . . . . . . . . . 65
4.2.3. Concatenación usando operadores no-miembro sobrecargados
68
. . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.3. Buscar en cadenas .
.
.
.
IV
i
i
i
i
i
i
“Volumen2” — 2012/1/12 — 13:53 — page V — #5
i
i
Índice general
4.3.1. Busqueda inversa .
. . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.3.2. Encontrar el primero/último de un conjunto de caracteres . . . 74
4.3.3. Borrar caracteres de cadenas
. . . . . . . . . . . . . . . . . . . . 76
4.3.4. Comparar cadenas . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.3.5. Cadenas y rasgos de caracteres . . . . . . . . . . . . . . . . . . . 82
4.4. Una aplicación con cadenas . . . . . . . . . . . . . . . . . . . . . . . . . 86
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.5. Resumen .
4.6. Ejercicios .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
. .
. .
.
.
.
.
.
.
.
.
5. Iostreams
5.4.
. . . . .
. . . . .
. . .
. . .
. . .
. . . . .
. . .
. . . . .
. . . . .
. . . . . .
5.3. Manejo errores de stream . . . . .
Leyendo bytes sin formato
. . . . .
5.1. ¿Por que iostream? . . .
5.2. Iostreams al rescate
5.2.3.1. Versiones sobrecargadas de get() . . . . .
5.2.3.2.
95
. . . . . . . . . . . . . . . 95
. . . . . . . . . . . . . . . . . . . . . . 99
Insertadores y extractores . . . . . . . . . . . . . . . . . . . . . . 99
5.2.1.
. . . . . . . . . . . . . . . . . . . . . . . . . 102
5.2.2. Uso común . .
5.2.3. Entrada orientada a líneas . . . . . . . . . . . . . . . . . . . . . . 104
. 105
. . . . . . . . . . . . . . . 105
. . . . . . . . 105
5.3.1. Estados del stream . . . . .
. . . . . . . 105
5.3.2. Streams y excepciones . . . . . . . . . . . . . . . . . . . . . . . . 107
Iostreams de fichero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.4.1. Un ejemplo de procesado de fichero. . . . . . . . . . . . . . . . . 108
5.4.2. Modos de apertura . . . . . . . . . . . . . . . . . . . . . . . . . . 109
. . . . . 110
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Iostreams de string . . . . .
. . . . . . . . . . . 115
5.7.1. Streams de cadena de entrada . . . . . . . . . . . . . . . . . . . . 115
5.7.2. Streams de cadena de salida . . . . . . . . . . . . . . . . . . . . . 117
5.8. Formateo de stream de salida . . . . . . . . . . . . . . . . . . . . . . . . 119
5.8.1. Banderas de formateo . . . . . . . . . . . . . . . . . . . . . . . . 120
5.8.2. Campos de formateo . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.8.3. Anchura, relleno y precisión . . . . . . . . . . . . . . . . . . . . 122
5.8.4. Un ejemplo exhaustivo . . . . . . . . . . . . . . . . . . . . . . . . 123
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
. . . . . . . . . . . . . . . . . . 127
. . . . . . . . . . . . . . . . . . . . . . . . . . . 129
. . . . . . . . . . . . . . . . . . . . . . . . . . . 130
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
5.9.1. Manipuladores con argumentos
5.9.2.
5.9.3.
.
5.5. Almacenamiento de iostream . . . . .
5.6. Buscar en iostreams .
5.7.
. . . . .
5.9. Manipuladores
. . .
. . .
. . . . .
. . . . .
. . . . .
. . .
.
.
. .
5.10.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
i
i
V
i
i
i
i
Índice general
.
.
5.10.1.
5.10.2.
5.10.3.
.
5.11.1.
5.11.2.
.
.
.
.
.
.
5.11.
5.12.
5.13.
“Volumen2” — 2012/1/12 — 13:53 — page VI — #6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . . . . . . . . . . . . . . . . . . . . 131
. . . . . . . . . . . . . . . . . . . . . . . . . . . 133
. . . . . . . . . . . . . . . . . . . . . . . . . . . 135
. . . . . . . . . . . . . . . . . . . . . . . . . . . 138
. . . . . . . . . . . . . . . . . . . . . . . . . . . 138
. . . . . . . . . . . . . . . . . . . . . . . . . . . 138
. . . . . . . . . . . . . . . . . . . . . . . . . . . 139
. . . . . . . . . . . . . . . . . . . . . . . . . . . 139
.
.
.
6.2.
.
.
.
.
.
.
.
.
.
.
6.1.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6.1.1.
6.1.2.
6.1.3.
6.1.4.
6. Las plantillas en profundidad
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6.1.4.1.
6.1.4.2.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6.1.5.
6.1.6.
.
6.2.1.
6.2.2.
6.2.3.
6.2.4.
6.2.5.
.
6.3.1.
6.3.2.
6.3.3.
6.3.4.
.
6.4.1.
6.4.2.
.
6.5.1.
6.5.2.
6.5.3.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Comentarios de: Pensar en C++ (Volumen 2) (0)
No hay comentarios