Está en la página 1de 322

“Volumen2” — 2010/4/18 — 23:05 — page I — #1

Pensar en C++ (Volumen 2)

Traducción (INACABADA) del libro Thinking in C++, Volumen 2

Bruce Eckel

18 de abril de 2010

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

“Volumen2” — 2010/4/18 — 23:05 — page II — #2

Pensar en C++ (Volumen 2) by Bruce Eckel

Copyright © 2004 Bruce Eckel

II

“Volumen2” — 2010/4/18 — 23:05 — page III — #3

Índice general

1.

Introducción

1

1.1. Objetivos .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

1

1.2. Capítulos .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.3. Ejercicios

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

3

1.3.1.

Soluciones de los ejercicios

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.4. Código fuente

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.5. Compiladores

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

4

1.6. Estándares del lenguaje .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

1.7. Seminarios, CD-ROMs y consultoría

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

5

1.8. Errores

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

6

1.9. Sobre la portada .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

6

1.10. Agradecimientos

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

6

I

Construcción de Sistemas estables

 

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

El bloque try

2.3.1. .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

16

2.3.2. Manejadores de excepción . 2.3.3. . .

2.4.1. Capturar cualquier excepción

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2.4. .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

16

16

17

2.4.2. Relanzar una excepción

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

2.4.3. Excepciones no capturadas

2.5. Limpieza

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

18

18

2.5.1. Gestión de recursos . 2.5.2. .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

19

20

III

“Volumen2” — 2010/4/18 — 23:05 — page IV — #4

Índice general

 

2.5.3. .

auto_ptr .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

2.5.4. Bloques try a nivel de función

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

2.6. Excepciones estándar

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

23

2.7. Especificaciones de excepciones

 

24

2.7.1. ¿Mejores especificaciones de excepciones?

 

.

.

.

.

.

.

.

.

.

.

.

.

25

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

2.10. Sobrecarga

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

28

2.11. Resumen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

29

2.12. Ejercicios

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

29

3.

Programación defensiva

31

3.1. Aserciones

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

33

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

3.3.2. Fichero de rastro

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

49

3.3.3. Encontrar agujeros en memoria

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

50

3.4. Resumen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

55

3.5. Ejercicios

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

55

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

4.3. Buscar en cadenas .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

69

IV

“Volumen2” — 2010/4/18 — 23:05 — page V — #5

Í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

4.5. Resumen

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

90

4.6. Ejercicios

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

91

5.

Iostreams

95

5.1. ¿Por que iostream?

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

95

5.2. Iostreams al rescate

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

99

5.2.1. Insertadores y extractores

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

99

5.2.2. Uso común

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 102

5.2.3. Entrada orientada a líneas .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 104

5.2.3.1. Versiones sobrecargadas de get()

.

.

.

.

.

.

.

.

.

105

5.2.3.2. Leyendo bytes sin formato

.

.

.

.

.

.

.

.

.

.

.

.

.

105

5.3. Manejo errores de stream .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 105

5.3.1. Estados del stream

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

105

5.3.2. Streams y excepciones

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

107

5.4. Iostreams de fichero .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

107

5.4.1. Un ejemplo de procesado de

 

108

5.4.2. Modos de apertura

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

109

5.5. Almacenamiento de iostream

110

5.6. Buscar en iostreams .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

. 112

5.7. 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

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.