C++ Estándar 
Programación con el Estándar ISO y la Biblioteca de Plantillas (STL)
© Paraninfo Thomson Learning 2001

CONTENIDOS DEL LIBRO
(Pulse aquí para ver un capítulo de muestra con marcas de agua)



Índice abreviado
Prefacio
1. Introducción

1ª Parte. PROGRAMACIÓN ESTRUCTURADA

2. Conceptos básicos
3. Tipos de datos
4. Control de flujo
5. Operadores
6. Funciones
7. Variables
8. Sobrecarga y conversiones
9. Punteros
10. Eficiencia y optimización

2ª Parte. PROGRAMACIÓN ORIENTADA A OBJETOS

11. Clases
12. Creación de objetos
13. Herencia y polimorfismo
14. Plantillas
15. Errores y excepciones
16. Modularidad

3ª Parte. LAS LIBRERÍAS ESTÁNDAR

17. Introducción a las librerías estándar
18. Entrada y salida
19. Cadenas y numéricos
20. Introducción a la STL
21. Contenedores y adaptadores
22. Objetos-funciones y algoritmos
23. El proceso de desarrollo con C++

APÉNDICES

Apéndice A. La evolución de C y C++
Apéndice B. Glosario de términos
Apéndice C. Bibliografía
Apéndice D. Índice analítico




Índice detallado

Índice de contenido...... V
Índice de tablas..... XVII

Prefacio

Por qué C++.... XIX
Objetivos del libro... XXI
Organización del libro... XXI
Uso como libro de texto..XXII
Requisitos previos. XXIII
Soporte Internet XXIII

1. Introducción

1.1. Principios de diseño del C++ 1
1.2. Paradigmas de programación.. 3
1.2.1. Programación estructurada 3
1.2.2. Programación modular 4
1.2.3. Abstracción de datos 4
1.2.4. Programación orientada a objetos 5
1.2.5. Programación genérica 6
1.2.6. Programación a gran escala 6
1.3. La evolución del C....... 7
1.4. La aparición del C++ 8
1.5. El estándar C++ 9
1.6. La biblioteca estándar 10
1.7. Presente y futuro del C++..... 10
1.8. El lenguaje unificado de modelado (UML). 11
1.9. Terminología 12

1ª Parte. PROGRAMACIÓN ESTRUCTURADA

2. Conceptos básicos

2.1. Estructura básica de un programa en C++..... 17
2.1.1. Sentencias 17
2.1.2. Directrices 18
2.1.3. Comentarios 18
2.1.4. Expresiones 19
2.2. Tipos de datos y variables..... 19
2.3. Funciones..... 20
2.4. Identificadores y palabras reservadas... 21
2.5. Símbolos reservados... 22
2.6. Uso de literales. 22
2.7. Inclusión de librerías. 23
2.8. Bases de entrada/salida..... 24
2.9. Convenciones de formato. 24
2.10. Ejercicios..... 25

3. Tipos de datos

3.1. Declaración de variables..... 27
3.2. Tipos fundamentales..... 28
3.2.1. Booleanos 28
3.2.2. Caracteres 29
3.2.3. Enteros 29
3.2.4. Uso de signed y unsigned 30
3.2.5. Tipos reales 30
3.2.6. El tipo void 31
3.3. Tipos derivados..... 31
3.3.1. Punteros 31
3.3.2. Vectores 32
3.3.3. Referencias 33
3.4. Tipos compuestos... 33
3.4.1. Estructuras 34
3.4.2. Uniones 34
3.4.3. Uniones anónimas 35
3.4.4. Campos de bits 36
3.5. Creación de nuevos tipos: typedef y enum..... 36
3.5.1. Uso de typedef 36
3.5.2. Tipos enumerados 37
3.6. Conversión explícita de tipos (casting) 38
3.7. Esquema de tipos en C++..... 39
3.8. Literales..... 39
3.8.1. Literales booleanos 40
3.8.2. Literales enteros 40
3.8.3. Literales reales 40
3.8.4. Literales carácter 41
3.8.5. Literales cadena 41
3.9. Ejercicios..... 42

4. Control de flujo

4.1. Verdadero y falso en C++..... 43
4.2. Sentencias condicionales 44
4.2.1. La sentencia if-else 44
4.2.2. La sentencia switch-case 45
4.3. Sentencias de repetición..... 47
4.3.1. Sentencia do-while 47
4.3.2. Sentencia while 47
4.3.3. Sentencia for 48
4.4. Sentencias de salto..... 49
4.4.1. Sentencia break 49
4.4.2. Sentencia continue 50
4.4.3. Sentencia goto 50
4.4.4. Sentencia return 51
4.5. Ejercicios..... 52

5. Operadores

5.1. Operandos destino 56
5.2. Operadores aritméticos... 57
5.3. Incremento y decremento.. 57
5.4. Operadores de comparación y lógicos 58
5.5. Operadores de bit 59
5.6. Operadores de asignación..... 60
5.7. Conversiones aritméticas... 61
5.8. Operador de evaluación..... 61
5.9. Operadores de indirección..... 62
5.10. Operador condicional.... 62
5.11. Operador sizeof... 62
5.12. Operadores de conversión.. 63
5.13. Operadores explícitos..... 65
5.14. Precedencia, asociatividad y orden de evaluación..... 65
5.15. Cuadro resumen de operadores..... 67
5.16. Ejercicios..... 69

6. Funciones

6.1. Declaración de funciones. El prototipo..... 71
6.2. Implementación de funciones. La definición..... 72
6.3. Invocación de funciones. La llamada 73
6.4. Retorno de valores. 73
6.5. La función main(), argumentos y retorno 74
6.6. Argumentos por valor y por referencia..... 75
6.7. Retornos por referencia..... 77
6.8. Argumentos por defecto. 77
6.9. Argumentos indefinidos..... 79
6.10. Recursividad. Uso de variables estáticas 80
6.11. Ejercicios..... 81

7. Variables

7.1. Ámbitos de los identificadores..... 83
7.1.1. Ámbitos locales 83
7.1.2. Acceso a variables globales 85
7.1.3. Resumen de los ámbitos 85
7.1.4. Operador de resolución de ámbito :: 86
7.1.5. Declaraciones y definiciones 87
7.2. Cualificadores const y volatile.. 87
7.2.1. Variables constantes 87
7.2.2. Enumeraciones anónimas 88
7.2.3. Variables volátiles 89
7.3. Modos de almacenamiento..... 89
7.4. Ejercicios..... 90

8. Sobrecarga y conversiones

8.1. Sobrecarga de funciones..... 93
8.1.1. “Name-Mangling” 94
8.2. Sobrecarga de operadores..... 95
8.2.1. Ejemplo de sobrecarga: números complejos 95
8.2.2. Operadores sobrecargables 98
8.3. Conversión de tipos en C++..... 99
8.4. Resolución de ambigüedades en la sobrecarga... 101
8.5. Ejercicios... 102

9. Punteros

9.1. Punteros y direcciones. 107
9.2. El puntero NULL 109
9.3. Punteros a void... 109
9.4. Aritmética con punteros... 110
9.5. Punteros a carácter (cadenas de caracteres)... 111
9.6. Relación entre vectores y punteros... 111
9.7. Operadores new y delete. 114
9.8. Punteros y estructuras. 115
9.9. Punteros a funciones... 116
9.10. Ejercicios... 119

10. Eficiencia y optimización

10.1. Macros... 121
10.1.1. Macros vs. constantes 123
10.2. Funciones inline... 123
10.2.1. Restricciones en el uso de inline 125
10.2.2. Macros vs. funciones inline 125
10.3. Instrucciones en ensamblador: asm... 126
10.4. Variables register 127
10.5. Optimización en los bucles. 128
10.6. Algunos consejos... 128
10.7. Medidas de tiempos de programas... 130
10.8. Manejo de memoria. Velocidad vs. memoria... 130
10.9. Eficiencia vs. claridad... 131
10.10. Opciones de compilación y enlazado... 131
10.11. Ejercicios... 132

2ª Parte. PROGRAMACIÓN ORIENTADA A OBJETOS

11. Clases

11.1. Clases y miembros... 138
11.1.1. Métodos (funciones miembros) 138
11.1.2. Tipos compuestos class 139
11.1.3. El argumento implícito this 142
11.1.4. Atributos (datos miembro) 143
11.1.5. Métodos definidos interna y externamente 144
11.1.6. Resolución de ámbito de clase 145
11.2. Control de acceso a miembros... 146
11.2.1. Ámbito de clase 146
11.2.2. Niveles de acceso 147
11.2.3. Acceso entre clases: amigas 149
11.3. Clases anidadas... 153
11.4. Sobrecarga de operadores en clases. 154
11.5. Miembros estáticos... 155
11.5.1. Atributos estáticos 156
11.5.2. Métodos estáticos 157
11.6. Resumen de miembros estáticos y amigos. Diferencias. 159
11.7. Ejercicios... 161

12. Creación de objetos

12.1. Inicializaciones... 165
12.2. Constructores y destructor... 166
12.2.1. Constructor por defecto 166
12.2.2. Constructores generales 167
12.2.3. Destructor 169
12.2.4. El constructor copia y el operador de asignación 170
12.2.5. Retornos de *this por valor y por referencia 176
12.2.6. Objetos temporales 177
12.2.7. Resumen de constructores y destructores 178
12.3. Conversiones entre clases. 179
12.3.1. Constructor de conversión 180
12.3.2. Operadores de conversión 183
12.3.3. Operador de asignación-conversión 183
12.3.4. Problemas con las conversiones 184
12.4. Objetos y miembros constantes... 186
12.4.1. Métodos constantes 186
12.4.2. Atributos constantes 188
12.4.3. Atributos mutables 188
12.5. Agregación de objetos. Constructores anidados... 189
12.6. Objetos dinámicos. 191
12.6.1. Vectores de objetos 191
12.6.2. Punteros a objetos 192
12.6.3. Sobrecarga de new y delete 193
12.6.4. Punteros a miembros. Operadores de acceso 195
12.7. Sobrecarga de algunos operadores... 196
12.7.1. Sobrecarga del operador [] 196
12.7.2. Sobrecarga del operador () 196
12.8. Resumen de métodos fundamentales en una clase... 197
12.9. Ejemplo final: la clase cadena... 198
12.10. Ejercicios... 202

13. Herencia y polimorfismo

13.1. Herencia en C++... 207
13.1.1. Acceso a miembros heredados 210
13.1.2. Modificadores de acceso en la derivación 211
13.1.3. Conversiones implícitas en la herencia 212
13.2. Especialización... 213
13.2.1. Agregación vs. herencia 216
13.2.2. Herencia múltiple 218
13.2.3. Orden de inicialización 220
13.2.4. Herencias duplicadas y virtuales 221
13.3. RTTI: Identificación de tipos... 223
13.3.1. Operador typeid 223
13.3.2. Clase type_info 224
13.4. Polimorfismo... 225
13.4.1. Métodos virtuales 225
13.4.2. Conversiones dinámicas 230
13.4.3. Destructores virtuales 233
13.4.4. Construcciones virtuales 233
13.4.5. Clases abstractas 234
13.4.6. Implementación de los métodos virtuales 236
13.4.7. Resumen de métodos virtuales 238
13.5. Ejercicios... 239

14. Plantillas

14.1. Genericidad 241
14.2. Plantillas de funciones... 242
14.2.1. Sobrecarga y plantillas de funciones 245
14.2.2. Especialización de plantillas de funciones 246
14.2.3. Punteros sobre instancias de plantillas de funciones 246
14.3. Plantillas de clases. 247
14.3.1. Parámetros constantes en plantillas 251
14.3.2. Uso de parámetros plantillas 251
14.3.3. Parámetros por defecto en plantillas 252
14.3.4. Herencia con plantillas de clases 252
14.3.5. Utilización de typename para plantillas de clases 253
14.4. Instanciación y especialización de plantillas... 254
14.4.1. Instanciación explícita 254
14.4.2. Especialización explícita 255
14.5. Ejemplo de plantilla: la clase pila... 255
14.6. Abstracción vs. genericidad 257
14.7. Ejercicios... 258

15. Errores y excepciones

15.1. Detección, identificación y corrección de errores 260
15.1.1. Errores comunes en C++ 261
15.2. Terminación anormal de un programa... 263
15.3. Manejo de excepciones en C++... 263
15.3.1. Funcionamiento y sintaxis 264
15.3.2. El lanzamiento de la excepción: throw 265
15.3.3. La captura: catch 265
15.3.4. El bloque de prueba: try 267
15.4. Especificación de excepciones. 268
15.5. Funciones especiales... 269
15.5.1. Función terminate() 270
15.5.2. Función unexpected() 271
15.5.3. Función uncaught_exception() 272
15.6. Utilización de excepciones. 272
15.6.1. Jerarquía de excepciones 273
15.6.2. Excepciones al reservar memoria 275
15.6.3. Excepciones en constructores 276
15.7. Excepciones predefinidas. 277
15.8. Ejercicios... 278

16. Modularidad

16.1. Preprocesamiento... 279
16.1.1. Fases del preprocesamiento 280
16.1.2. Secuencias trígrafo 280
16.1.3. Definición de macros y expansión 281
16.1.4. Sustitución de parámetros en macros 281
16.1.5. Inclusión de ficheros 282
16.2. Compilación condicional.. 283
16.2.1. Macros predefinidos 284
16.2.2. Expresiones determinadas en tiempo de compilación 284
16.2.3. Otras directrices de compilación 285
16.3. Trabajando con módulos... 285
16.3.1. Inclusión de ficheros 286
16.3.2. Especificaciones de enlazado 287
16.3.3. Interfaz e implementación 289
16.3.4. Cabeceras (Header Files) 291
16.3.5. Restricciones en la ocultación de información 294
16.3.6. Duplicación de cabeceras 295
16.3.7. Referencias cruzadas y declaraciones globales 296
16.3.8. Concordancia entre clases y ficheros 297
16.3.9. Uso de proyectos 298
16.4. Espacios de nombres... 298
16.4.1. Namespace 299
16.4.2. Using 300
16.4.3. Alias de espacios de nombres 302
16.4.4. Espacios de nombres anónimos 302
16.4.5. Creación y uso de librerías 303
16.4.6. Modularidad basada en espacios de nombres 304
16.5. Combinación con otros lenguajes... 304
16.6. Metodología de la programación modular... 305
16.7. Ejercicios... 307

3ª Parte. LAS LIBRERÍAS ESTÁNDAR

17. Introducción a las librerías estándar

17.1. La estandarización de las librerías 312
17.1.1. Las primeras librerías de C 312
17.1.2. La librería inicial de C++ 313
17.1.3. La STL (Standard Template Library) 313
17.2. La librería ISO C 314
17.3. La librería estándar de C++... 315
17.3.1. Estructura global 316
17.3.2. Soporte al lenguaje 317
17.3.3. Utilidades generales 317
17.3.4. Diagnóstico 318
17.3.5. Cadenas 318
17.3.6. Locales 318
17.3.7. Contenedores 319
17.3.8. Iteradores 319
17.3.9. Algoritmos 319
17.3.10. Numéricos 320
17.3.11. La E/S 320

18. Entrada y salida

18.1. Introducción a los streams... 321
18.2. Inserción y extracción... 322
18.2.1. Salida sobre un stream 323
18.2.2. Entrada desde un stream 324
18.2.3. Sobrecarga de los operadores << y >> 324
18.3. Estado de un stream 326
18.4. Formato de E/S en streams... 327
18.4.1. Ancho y caracteres de relleno en la salida 328
18.4.2. Estado del formato 329
18.4.3. Manipuladores 331
18.5. Otras funciones sobre streams... 334
18.6. Ligando streams... 335
18.7. Streams fichero 336
18.7.1. Acceso aleatorio a fichero 338
18.8. Streams cadena... 338
18.9. Plantillas y jerarquía de clases stream 340
18.10. Streams buffer. 341
18.11. Localización regional... 342
18.12. E/S de la librería C... 343
18.13. Ejercicios... 346

19. Cadenas y numéricos

19.1. Cadenas. Clase string 349
19.2. Funciones sobre punteros a carácter... 354
19.3. Límites numéricos: numeric_limits... 355
19.4. Funciones matemáticas estándar... 356
19.5. Vectores numéricos... 357
19.5.1. valarray 357
19.5.2. slices 359
19.5.3. Otras clases de operaciones con vectores 361
19.6. Aritmética compleja: clase complex... 361
19.7. Ejercicios... 362

20. Introducción a la STL

20.1. Componentes de la STL... 365
20.2. Características generales de los contenedores... 366
20.3. Iteradores de contenedores... 369
20.4. Iteradores de streams... 374
20.4.1. ostream_iterator 374
20.4.2. istream_iterator 376
20.5. Gestión de memoria... 377
20.5.1. allocator 377
20.5.2. Gestión de memoria estilo C 380
20.6. Clase pair... 381
20.7. Ejercicios... 383

21. Contenedores y adaptadores

21.1. Contenedores... 385
21.1.1. Contenedor vector 385
21.1.2. Contenedor list 387
21.1.3. Contenedor deque 389
21.1.4. Contenedor set 390
21.1.5. Contenedor multiset 392
21.1.6. Contenedor map 393
21.1.7. Contenedor multimap 395
21.2. Casi contenedores... 397
21.3. Adaptadores de contenedores... 397
21.3.1. Adaptador de contenedor stack 397
21.3.2. Adaptador de contenedor queue 398
21.3.3. Adaptador de contenedor priority_queue 399
21.4. Ejercicios... 400

22. Objetos-funciones y algoritmos

22.1. Creación de objetos-funciones... 403
22.2. Objetos-funciones predefinidos... 404
22.2.1. Objetos-funciones predicados 405
22.2.2. Objetos-funciones aritméticos 406
22.2.3. Otros objetos-funciones 407
22.3. Clasificación de los algoritmos... 407
22.4. Algorimos de secuencia cambiantes. 408
22.4.1. copy 408
22.4.2. copy_backward 409
22.4.3. swap, iter_swap y swap_ranges 410
22.4.4. transform 411
22.4.5. replace, replace_if, replace_copy y replace_copy_if 412
22.4.6. fill y fill_n 414
22.4.7. generate y generate_n 415
22.4.8. remove, remove_if, remove_copy y remove_copy_if 416
22.4.9. unique y unique_copy 418
22.4.10. reverse y reverse_copy 419
22.4.11. rotate y rotate_copy 420
22.4.12. random_shuffle 421
22.4.13. partition y stable_partition 422
22.5. Algoritmos de secuencia no cambiantes. 423
22.5.1. for_each 423
22.5.2. find, find_if, find_first_of, find_end y adjacent_find 424
22.5.3. count y count_if 427
22.5.4. mismatch, equal, search y search_n 428
22.6. Algoritmos de ordenación y operaciones relacionadas 430
22.6.1. Operaciones de ordenación 430
22.6.2. Operaciones de conjuntos 435
22.6.3. Operaciones sobre montículos 438
22.6.4. Mínimos y máximos 441
22.6.5. lexicographical_compare 442
22.6.6. Permutaciones 443
22.7. Algoritmos numéricos generalizados... 445
22.7.1. accumulate 445
22.7.2. inner_product, partial_sum y adjacent_difference 446
22.8. Ejercicios... 448

23. El proceso de desarrollo con C++

23.1. Introducción... 451
23.2. El proceso unificado de desarrollo... 454
23.2.1. Dirigido por casos de uso 455
23.2.2. Centrado en la arquitectura 455
23.2.3. Iterativo e incremental 456
23.2.4. El ciclo del proceso unificado 457
23.2.5. Flujos de trabajo 459
23.2.6. Conclusiones 460
23.3. Análisis y diseño orientado a objetos... 461
23.4. Ejemplo: Análisis y diseño de un intérprete... 463
23.4.1. Casos de uso 464
23.4.2. Identificación de clases y responsabilidades 464
23.4.3. Identificación de los atributos 465
23.4.4. Identificación de asociaciones y agregaciones 466
23.4.5. Identificación de generalizaciones 466
23.4.6. Identificación de las operaciones 467
23.4.7. Definición de atributos y tipos 467
23.4.8. Clases de diseño 468
23.4.9. Descripción de los métodos 469
23.4.10. Descripción de estados 470
23.5. Ejemplo: Implementación del intérprete... 471
23.5.1. Cabeceras, tipos y estructuras 471
23.5.2. Excepciones 471
23.5.3. Clase Almacen y sus instancias 472
23.5.4. Clases Pantalla y Entrada 473
23.5.5. Clase Interprete 474
23.5.6. Operandos 475
23.5.7. Instrucciones 478
23.5.8. Contenedor de instrucciones y operandos 481
23.5.9. La clase Programa y la interpretación 482
23.5.10. Utilización del intérprete 484
23.5.11. Conclusiones 485
23.6. Ejercicios... 485

APÉNDICES

Apéndice A. La evolución de C y C++

A.1. Versiones de C y C++.... 487
A.1.1. El C de Kernighan & Ritchie............ 487
A.1.2. ISO C......... 488
A.1.3. Las primeras versiones de C++ 488
A.1.4. C++ estándar 489
A.2. Diferencias entre C y C++.................. 490
A.2.1. Restricciones fundamentales........ 490
A.2.2. Problemas de compatibilidad entre C y C++. 491
A.3. Combinación de C y C++ 492
A.4. Versiones futuras...... 493
A.4.1. El futuro del C............ 493
A.4.2. El futuro del C++..... 495
A.5. Lenguajes basados en C++: Java y C#............. 496
A.5.1. Java............ 496
A.5.2. C#............ 498
A.5.3. Conclusiones......... 499
A.6. Otras librerías.... 500

Apéndice B. Glosario de términos

Apéndice C. Bibliografía

C.1. Libros 511
C.2. Revistas, organizaciones y otras fuentes..... 513

Apéndice D. Índice analítico



 
Última actualización: 
7 de noviembre de 2001.
Ir a la página principal
© 2001 Paraninfo Thomson Learning y los autores:
Enrique Hernández Orallo, José Hernández Orallo y Mª Carmen Juan Lizandra