Pensar en C++ (Volumen 1)

Traducción (cuasi-terminada) del libro Thinking in C++, Volumen 1

Bruce Eckel

Mindview, Inc.

Historial de revisiones
Revisión $Revision$ 2010-04-03
Revisión 13 2001-09-27 Bruce Eckel

Tabla de contenidos

Prólogo a la traducción
1. Licencia y normas de distribución
2. Tecnicismos
3. Código fuente
4. Producción
5. El equipo
6. Agradecimientos
7. Utilidades
Prefacio
1. Material nuevo en la segunda edición
2. Requisitos
3. Aprender C++
4. Objetivos
5. Capítulos
6. Ejercicios
7. Código fuente
8. Estándares del lenguaje
9. El CD-ROM del libro
10. CD-ROMs, seminarios, y consultoría
11. Errores
12. Sobre la portada
13. Diseño del libro y producción
14. Agradecimientos
1. Introducción a los Objetos
1.1. El progreso de abstracción
1.2. Cada objeto tiene una interfaz
1.3. La implementación oculta
1.4. Reutilizar la implementación
1.5. Herencia: reutilización de interfaces
1.6. Objetos intercambiables gracias al polimorfismo
1.7. Creación y destrucción de objetos
1.8. Gestión de excepciones: tratamiento de errores
1.9. Análisis y diseño
1.10. Programación Extrema
1.11. Porqué triunfa C++
1.12. Estrategias de transición
1.13. Resumen
2. Construir y usar objetos
2.1. El proceso de traducción del lenguaje
2.2. Herramientas para compilación modular
2.3. Su primer programa en C++
2.4. Más sobre iostreams
2.5. Introdución a las cadenas
2.6. Lectura y escritura de ficheros
2.7. Introducción a los vectores
2.8. Resumen
2.9. Ejercicios
3. C en C++
3.1. Creación de funciones
3.2. Control de flujo
3.3. Introducción a los operadores
3.4. Introducción a los tipos de datos
3.5. Alcance
3.6. Especificar la ubicación del espacio de almacenamiento
3.7. Los operadores y su uso
3.8. Creación de tipos compuestos
3.9. Consejos para depuración
3.10. Direcciones de función
3.11. Make: cómo hacer compilación separada
3.12. Resumen
3.13. Ejercicios
4. Abstracción de Datos
4.1. Una librería pequeña al estilo C
4.2. ¿Qué tiene de malo?
4.3. El objeto básico
4.4. ¿Qué es un objeto?
4.5. Tipos abstractos de datos
4.6. Detalles del objeto
4.7. Conveciones para los ficheros de cabecera
4.8. Estructuras anidadas
4.9. Resumen
4.10. Ejercicios
5. Ocultar la implementación
5.1. Establecer los límites
5.2. Control de acceso en C++
5.3. Amigos (friends)
5.4. Capa de objetos
5.5. La clase
5.6. Manejo de clases
5.7. Resumen
5.8. Ejercicios
6. Inicialización y limpieza
6.1. Inicialización garantizada por el constructor
6.2. Limpieza garantizada por el destructor
6.3. Eliminación del bloque de definiciones
6.4. Stash con constructores y destructores
6.5. Stack con constructores y destructores
6.6. Inicialización de tipos agregados
6.7. Constructores por defecto
6.8. Resumen
6.9. Ejercicios
7. Sobrecarga de funciones y argumentos por defecto
7.1. Más decoración de nombres
7.2. Ejemplo de sobrecarga
7.3. Uniones
7.4. Argumentos por defecto
7.5. Elección entre sobrecarga y argumentos por defecto
7.6. Resumen
7.7. Ejercicios
8. Constantes
8.1. Sustitución de valores
8.2. Punteros
8.3. Argumentos de funciones y valores de retorno
8.4. Clases
8.5. Volatile
8.6. Resumen
8.7. Ejercicios
9. Funciones inline
9.1. Los peligros del preprocesador
9.2. Funciones inline
9.3. Stash y Stack con inlines
9.4. Funciones inline y el compilador
9.5. Reducir el desorden
9.6. Más características del preprocesador
9.7. Comprobación de errores mejorada
9.8. Resumen
9.9. Ejercicios
10. Control de nombres
10.1. Los elementos estáticos de C
10.2. Espacios de nombres
10.3. Miembros estáticos en C++
10.4. Dependencia en la inicialización de variables estáticas
10.5. Especificaciones de enlazado alternativo
10.6. Resumen
10.7. Ejercicios
11. Las referencias y el constructor de copia
11.1. Punteros en C++
11.2. Referencias en C++
11.3. El constructor de copia
11.4. Punteros a miembros
11.5. Resumen
11.6. Ejercicios
12. Sobrecarga de operadores
12.1. Precaución y tranquilidad
12.2. Sintaxis
12.3. Operadores sobrecargables
12.4. Operadores no miembros
12.5. Sobrecargar la asignación
12.6. Conversión automática de tipos
12.7. Resumen
12.8. Ejercicios
13. Creación dinámica de objetos
13.1. Creación de objetos
13.2. Rediseño de los ejemplos anteriores
13.3. new y delete para vectores
13.4. Resumen
13.5. Ejercicios
14. Herencia y Composición
14.1. Sintaxis de la composición
14.2. Sintaxis de la herencia
14.3. Lista de inicializadores de un constructor
14.4. Ocultación de nombres
14.5. Funciones que no heredan automáticamente
14.6. Protected
14.7. Herencia y sobrecarga de operadores
14.8. Herencia múltiple
14.9. Desarrollo incremental
14.10. Upcasting
14.11. Resumen
14.12. Ejercicios
15. Polimorfismo y Funciones virtuales
15.1. Evolución de los programadores de C++
15.2. Upcasting
15.3. El problema
15.4. Funciones virtuales
15.5. Cómo implementa C++ la ligadura dinámica
15.6. ¿Por qué funciones virtuales?
15.7. Clases base abstractas y funciones virtuales puras
15.8. Herencia y la VTABLE
15.9. Sobrecargar y redefinir
15.10. funciones virtuales y constructores
15.11. Sobrecarga de operadores
15.12. Downcasting
15.13. Resumen
15.14. Ejercicios
16. Introducción a las Plantillas
16.1. Contenedores
16.2. Un vistazo a las plantillas
16.3. Sintaxis del Template
16.4. Stack y Stash como Plantillas
16.5. Activando y desactivando la propiedad
16.6. Manejando objetos por valor
16.7. Introducción a los iteradores
16.8. Por qué usar iteradores
16.9. Resumen
16.10. Ejercicios
A. Estilo de codificación
A.1. General
A.2. Nombres de fichero
A.3. Marcas comentadas de inicio y fin
A.4. Paréntesis, llaves e indentación
A.5. Nombres para identificadores
A.6. Orden de los #includes
A.7. Guardas de inclusión en ficheros de cabecera
A.8. Uso de los espacios de nombres
A.9. Utilización de require() y assure()
B. Directrices de Programación
C. Lecturas recomendadas
C.1. Sobre C
C.2. Sobre C++ en general
C.3. Los rincones oscuros
C.4. Sobre Análisis y Diseño

Lista de figuras

1.1. Clase Luz
1.2. Un coche tiene un motor
1.3. subclases
1.4. Jerarquía de Figura
1.5. Especialización de Figura
1.6. Reescritura de métodos
1.7. Relaciones
1.8. Polimorfismo
1.9. Upcasting
1.10. Diagramas de casos de uso
1.11. Un ejemplo de caso de uso
11.1. Llamada a una función
14.1. Upcasting
15.1. Funciones virtuales
15.2. Tabla de punteros virtuales
15.3. Clase abstracta
15.4. Una nueva función virtual
15.5. Object slicing
16.1. Contenedores
16.2. Herencia múltiple
16.3. Contenedor de objetos Figura

Lista de tablas

3.1. Expresiones que utilizan booleanos
3.2. Moldes explícitos de C++
3.3. Nuevas palabras reservadas para operadores booleanos
12.1. Directrices para elegir entre miembro y no-miembro

Índice de listados

2.1. C02/Declare.cpp
2.2. C02/Hello.cpp
2.3. C02/Stream2.cpp
2.4. C02/Concat.cpp
2.5. C02/Numconv.cpp
2.6. C02/CallHello.cpp
2.7. C02/HelloStrings.cpp
2.8. C02/Scopy.cpp
2.9. C02/FillString.cpp
2.10. C02/Fillvector.cpp
2.11. C02/GetWords.cpp
2.12. C02/Intvector.cpp
3.1. C03/Return.cpp
3.2. C03/Ifthen.cpp
3.3. C03/Guess.cpp
3.4. C03/Guess2.cpp
3.5. C03/Charlist.cpp
3.6. C03/Menu.cpp
3.7. C03/Menu2.cpp
3.8. C03/gotoKeyword.cpp
3.9. C03/CatsInHats.cpp
3.10. C03/AutoIncrement.cpp
3.11. C03/Basic.cpp
3.12. C03/Specify.cpp
3.13. C03/YourPets1.cpp
3.14. C03/YourPets2.cpp
3.15. C03/PassByValue.cpp
3.16. C03/PassAddress.cpp
3.17. C03/PassReference.cpp
3.18. C03/AllDefinitions.cpp
3.19. C03/VoidPointer.cpp
3.20. C03/CastFromVoidPointer.cpp
3.21. C03/Scope.cpp
3.22. C03/OnTheFly.cpp
3.23. C03/Global.cpp
3.24. C03/Global2.cpp
3.25. C03/Static.cpp
3.26. C03/FileStatic.cpp
3.27. C03/FileStatic2.cpp
3.28. C03/Forward.cpp
3.29. C03/Mathops.cpp
3.30. C03/Boolean.cpp
3.31. C03/printBinary.h
3.32. C03/printBinary.cpp
3.33. C03/Bitwise.cpp
3.34. C03/Rotation.cpp
3.35. C03/CommaOperator.cpp
3.36. C03/Pitfall.cpp
3.37. C03/SimpleCast.cpp
3.38. C03/FunctionCallCast.cpp
3.39. C03/static_cast.cpp
3.40. C03/const_cast.cpp
3.41. C03/reinterpret_cast.cpp
3.42. C03/sizeof.cpp
3.43. C03/sizeofOperator.cpp
3.44. C03/SimpleStruct.cpp
3.45. C03/SimpleStruct2.cpp
3.46. C03/SelfReferential.cpp
3.47. C03/SimpleStruct3.cpp
3.48. C03/Enum.cpp
3.49. C03/Union.cpp
3.50. C03/Arrays.cpp
3.51. C03/StructArray.cpp
3.52. C03/ArrayAddresses.cpp
3.53. C03/ArrayIdentifier.cpp
3.54. C03/PointersAndBrackets.cpp
3.55. C03/ArrayArguments.cpp
3.56. C03/CommandLineArgs.cpp
3.57. C03/ArgsToInts.cpp
3.58. C03/FloatingAsBinary.cpp
3.59. C03/PointerIncrement.cpp
3.60. C03/PointerIncrement2.cpp
3.61. C03/PointerArithmetic.cpp
3.62. C03/DynamicDebugFlags.cpp
3.63. C03/StringizingExpressions.cpp
3.64. C03/Assert.cpp
3.65. C03/PointerToFunction.cpp
3.66. C03/FunctionTable.cpp
4.1. C04/CLib.h
4.2. C04/CLib.cpp
4.3. C04/CLibTest.cpp
4.4. C04/CppLib.h
4.5. C04/CppLib.cpp
4.6. C04/CppLibTest.cpp
4.7. C04/Sizeof.cpp
4.8. C04/Simple.h
4.9. C04/Stack.h
4.10. C04/Stack.cpp
4.11. C04/StackTest.cpp
4.12. C04/Scoperes.cpp
5.1. C05/Public.cpp
5.2. C05/Private.cpp
5.3. C05/Friend.cpp
5.4. C05/NestFriend.cpp
5.5. C05/Class.cpp
5.6. C05/Stash.h
5.7. C05/Stack2.h
5.8. C05/Handle.h
5.9. C05/Handle.cpp
5.10. C05/UseHandle.cpp
6.1. C06/Constructor1.cpp
6.2. C06/DefineInitialize.cpp
6.3. C06/Nojump.cpp
6.4. C06/Stash2.h
6.5. C06/Stash2.cpp
6.6. C06/Stash2Test.cpp
6.7. C06/Stack3.h
6.8. C06/Stack3.cpp
6.9. C06/Stack3Test.cpp
6.10. C06/Multiarg.cpp
6.11. C06/AutoDefaultConstructor.cpp
7.1. C07/Def.cpp
7.2. C07/Use.cpp
7.3. C07/Stash3.h
7.4. C07/Stash3.cpp
7.5. C07/Stash3Test.cpp
7.6. C07/UnionClass.cpp
7.7. C07/SuperVar.cpp
7.8. C07/AnonymousUnion.cpp
7.9. C07/Mem.h
7.10. C07/Mem.cpp
7.11. C07/MemTest.cpp
7.12. C07/Mem2.h
8.1. C08/Safecons.cpp
8.2. C08/Constag.cpp
8.3. C08/ConstPointers.cpp
8.4. C08/PointerAssignment.cpp
8.5. C08/Constval.cpp
8.6. C08/ConstReturnValues.cpp
8.7. C08/ConstPointer.cpp
8.8. C08/ConstTemporary.cpp
8.9. C08/ConstInitialization.cpp
8.10. C08/BuiltInTypeConstructors.cpp
8.11. C08/EncapsulatingTypes.cpp
8.12. C08/StringStack.cpp
8.13. C08/EnumHack.cpp
8.14. C08/ConstMember.cpp
8.15. C08/Quoter.cpp
8.16. C08/Castaway.cpp
8.17. C08/Mutable.cpp
8.18. C08/Volatile.cpp
9.1. C09/MacroSideEffects.cpp
9.2. C09/Inline.cpp
9.3. C09/Access.cpp
9.4. C09/Rectangle.cpp
9.5. C09/Rectangle2.cpp
9.6. C09/Cpptime.h
9.7. C09/Cpptime.cpp
9.8. C09/Stash4.h
9.9. C09/Stash4.cpp
9.10. C09/Stash4Test.cpp
9.11. C09/Stack4.h
9.12. C09/Stack4Test.cpp
9.13. C09/EvaluationOrder.cpp
9.14. C09/Hidden.cpp
9.15. C09/Noinsitu.cpp
9.16. C09/ErrTest.cpp
10.1. C10/StaticVariablesInfunctions.cpp
10.2. C10/StaticObjectsInFunctions.cpp
10.3. C10/StaticDestructors.cpp
10.4. C10/LocalExtern.cpp
10.5. C10/MyLib.cpp
10.6. C10/Header1.h
10.7. C10/BobsSuperDuperLibrary.cpp
10.8. C10/FriendInjection.cpp
10.9. C10/ScopeResolution.cpp
10.10. C10/NamespaceInt.h
10.11. C10/NamespaceMath.h
10.12. C10/Arithmetic.cpp
10.13. C10/NamespaceOverriding1.cpp
10.14. C10/NamespaceOverriding2.h
10.15. C10/OverridingAmbiguity.cpp
10.16. C10/UsingDeclaration.h
10.17. C10/UsingDeclaration2.cpp
10.18. C10/Statinit.cpp
10.19. C10/StaticArray.cpp
10.20. C10/StaticObjectArrays.cpp
10.21. C10/Local.cpp
10.22. C10/SimpleStaticMemberFunction.cpp
10.23. C10/StaticMemberFunctions.cpp
10.24. C10/Singleton.cpp
10.25. C10/Out.cpp
10.26. C10/Oof.cpp
10.27. C10/Initializer.h
10.28. C10/InitializerDefs.cpp
10.29. C10/Initializer.cpp
10.30. C10/Initializer2.cpp
10.31. C10/Dependency1.h
10.32. C10/Dependency2.h
10.33. C10/Technique2.cpp
10.34. C10/Dependency1StatFun.h
10.35. C10/Dependency2StatFun.h
10.36. C10/Dependency1StatFun.cpp
10.37. C10/Dependency2StatFun.cpp
10.38. C10/Technique2b.cpp
11.1. C11/FreeStandingReferences.cpp
11.2. C11/Reference.cpp
11.3. C11/ConstReferenceArguments.cpp
11.4. C11/ReferenceToPointer.cpp
11.5. C11/PassingBigStructures.cpp
11.6. C11/HowMany.cpp
11.7. C11/HowMany2.cpp
11.8. C11/Linenum.cpp
11.9. C11/DefaultCopyConstructor.cpp
11.10. C11/NoCopyConstruction.cpp
11.11. C11/SimpleStructure.cpp
11.12. C11/PointerToMemberData.cpp
11.13. C11/PmemFunDefinition.cpp
11.14. C11/PointerToMemberFunction.cpp
11.15. C11/PointerToMemberFunction2.cpp
12.1. C12/OperatorOverloadingSyntax.cpp
12.2. C12/OverloadingUnaryOperators.cpp
12.3. C12/Integer.h
12.4. C12/Integer.cpp
12.5. C12/IntegerTest.cpp
12.6. C12/Byte.h
12.7. C12/ByteTest.cpp
12.8. C12/OverloadingOperatorComma.cpp
12.9. C12/SmartPointer.cpp
12.10. C12/NestedSmartPointer.cpp
12.11. C12/PointerToMemberOperator.cpp
12.12. C12/IostreamOperatorOverloading.cpp
12.13. C12/CopyingVsInitialization.cpp
12.14. C12/SimpleAssignment.cpp
12.15. C12/CopyingWithPointers.cpp
12.16. C12/ReferenceCounting.cpp
12.17. C12/AutomaticOperatorEquals.cpp
12.18. C12/AutomaticTypeConversion.cpp
12.19. C12/ExplicitKeyword.cpp
12.20. C12/OperatorOverloadingConversion.cpp
12.21. C12/ReflexivityInOverloading.cpp
12.22. C12/Strings1.cpp
12.23. C12/Strings2.cpp
12.24. C12/TypeConversionAmbiguity.cpp
12.25. C12/TypeConversionFanout.cpp
12.26. C12/CopyingVsInitialization2.cpp
13.1. C13/MallocClass.cpp
13.2. C13/Tree.h
13.3. C13/BadVoidPointerDeletion.cpp
13.4. C13/PStash.h
13.5. C13/PStash.cpp
13.6. C13/PStashTest.cpp
13.7. C13/NewHandler.cpp
13.8. C13/GlobalOperatorNew.cpp
13.9. C13/Framis.cpp
13.10. C13/ArrayOperatorNew.cpp
13.11. C13/NoMemory.cpp
13.12. C13/PlacementOperatorNew.cpp
14.1. C14/Useful.h
14.2. C14/Composition.cpp
14.3. C14/Composition2.cpp
14.4. C14/Inheritance.cpp
14.5. C14/PseudoConstructor.cpp
14.6. C14/Combined.cpp
14.7. C14/Order.cpp
14.8. C14/NameHiding.cpp
14.9. C14/InheritStack.cpp
14.10. C14/SynthesizedFunctions.cpp
14.11. C14/Car.cpp
14.12. C14/FName1.cpp
14.13. C14/FName2.cpp
14.14. C14/PrivateInheritance.cpp
14.15. C14/Protected.cpp
14.16. C14/OperatorInheritance.cpp
14.17. C14/Instrument.cpp
14.18. C14/CopyConstructor.cpp
14.19. C14/InheritStack2.cpp
15.1. C15/Instrument2.cpp
15.2. C15/Instrument3.cpp
15.3. C15/Instrument4.cpp
15.4. C15/Sizes.cpp
15.5. C15/Early.cpp
15.6. C15/Instrument5.cpp
15.7. C15/PureVirtualDefinitions.cpp
15.8. C15/AddingVirtuals.cpp
15.9. C15/ObjectSlicing.cpp
15.10. C15/NameHiding2.cpp
15.11. C15/VariantReturn.cpp
15.12. C15/VirtualDestructors.cpp
15.13. C15/UnAbstract.cpp
15.14. C15/PureVirtualDestructors.cpp
15.15. C15/VirtualsInDestructors.cpp
15.16. C15/OStack.h
15.17. C15/OStackTest.cpp
15.18. C15/OperatorPolymorphism.cpp
15.19. C15/DynamicCast.cpp
15.20. C15/StaticHierarchyNavigation.cpp
16.1. C16/IntStack.cpp
16.2. C16/fibonacci.h
16.3. C16/fibonacci.cpp
16.4. C16/Array.cpp
16.5. C16/Array2.cpp
16.6. C16/StackTemplate.h
16.7. C16/StackTemplateTest.cpp
16.8. C16/Array3.cpp
16.9. C16/TStack.h
16.10. C16/TStackTest.cpp
16.11. C16/TPStash.h
16.12. C16/AutoCounter.h
16.13. C16/AutoCounter.cpp
16.14. C16/TPStashTest.cpp
16.15. C16/OwnerStack.h
16.16. C16/OwnerStackTest.cpp
16.17. C16/ValueStack.h
16.18. C16/SelfCounter.h
16.19. C16/SelfCounter.cpp
16.20. C16/ValueStackTest.cpp
16.21. C16/IterIntStack.cpp
16.22. C16/NestedIterator.cpp
16.23. C16/IterStackTemplate.h
16.24. C16/IterStackTemplateTest.cpp
16.25. C16/TStack2.h
16.26. C16/TStack2Test.cpp
16.27. C16/TPStash2.h
16.28. C16/TPStash2Test.cpp
16.29. C16/Shape.h
16.30. C16/Drawing.cpp