Pensar en C++

El equipo de traducción de Pensar en C++

Historial de revisiones
Revisión 0.128-02-2004DV
Creación de documento raíz

Tabla de contenidos

1. Construir y usar objetos
El proceso de traducción del lenguaje
Intérpretes
Compiladores
El proceso de compilación
Herramientas para compilación modular
Declaraciones vs definiciones
Enlazado
Uso de librerías
Su primer programa en C++
Uso de las clases iostream
Espacios de nombres
Fundamentos de la estructura de un programa
Hello, World!
Ejecutar al compilador
Más sobre iostream
Concatenar vectores de caracteres
Leer de la entrada
Llamar a otros programas
Introducir cadenas
Lectura y escritura de ficheros
Introducción a los vectores
Resumen
Ejercicios
2. El C en C++
Creación de funciones
Funciones que retornan valores
Uso de funciones de librerías C
Creación de librerías propias
Control de la ejecuión
Verdadero y falso
if-else
while
do-while
for
Las sentencias break y continue
switch
Uso y maluso de goto
Recursividad
Introducción a los operadores
Precedencia
Auto incremento y decremento
Introducción a los tipos de datos
Tipos empotrados básicos
booleano, true y false
Especificadores
Introducción a los punteros
FIXME: Modifying the outside object
Introducción a las referencias de C++
Punteros y referencias como modificadores
Alcance
Definición de variables 'al vuelo'
Especificación del almacenamiento
Variables globales
Variables locales
static
extern
Constantes
volatile
Los operadores y su uso
Asignación
Operadores matemáticos
Operadores relacionales
Operadores lógicos
Operadores para bits
Operadores de desplazamiento
Operadores unarios
El operador ternario
El operador ternario
El operador ternario
El operador coma
Trampas habituales cuando se usan los operadores
Operadores del molde (casting)
Moldeado explícito en C++
sizeof - un operador en si mismo
La palabra reservada keyword
Operadores explícitos
Creación de tipos compuestos
Operadores explícitos
Creación de alias usando typedef
Combinación de variables por medio de struct
Programas más claros gracias a enum
Cómo Ahorrar memoria con union
Arrays
FIXME: Debugging hints
Opciones para depuración
Convertir variables y expresiones en cadenas
La macro C assert()
Direcciones de función
Definición de un puntero a función
Declaraciones y definiciones complicadas
Uso de un puntero a función
Arrays de punteros a funciones
Make: cómo hacer compilación separada
Las actividades de Make
Los Makefiles de este libro
Un ejemplo de Makefile
Resumen
Ejercicios
3. Abstracción de Datos
Una librería pequeña al estilo de C
Almacenamiento dinámico
Suposiciones equivocadas
¿Qué está mal?
El objeto básico
¿Qué es un objeto?
Tipado de datos abstracto
Detalles del objeto
Conveciones de los ficheros de cabecera
Importancia de los ficheros de cabecera
El problema de la declaración múltiple
Las directivas del preprocesador #define, #ifndef y #endif
Un estándar para los ficheros de cabecera
Espacios de nombres en las cabeceras
Uso de las cabeceras en proyectos
Estructuras anidadas
Resolución del alcance global
Resumen
Ejercicios
4. Ocultar la implementación
Establecer los límites
Control de acceso en C++
protected
Friends
Amigas anidadas
¿Es eso puro?
Capa de objetos
La clase
Modificaciones en Stash para usar control de acceso
Modificar Stack para usar control de acceso
Manejo de clases
Ocultar la implementación
Reducir la recompilación
Resumen
Ejercicios
5. Inicialización y limpieza
Inicialización garantizada por el constructor
Limpieza garantizada por el destructor
Eliminación del bloque de definiciones
para bucles
Alojamiento de memoria
Stash con constructores y destructores
Stack con constructores y destructores
Inicialización de tipos agregados
Constructores por defecto
Resumen
Ejercicios
6. Sobrecarga de funciones y argumentos por defecto
Más decoración de nombres
Sobrecarga en el valor de retorno
Enlace con tipos seguros
Ejemplo de sobrecarga
Uniones
Argumentos por defecto
Argumentos de relleno
Elección entre sobrecarga y argumentos por defecto
Resumen
Ejercicios
7. Constantes
Sustitución de valores
const en archivos de cabecera
constantes seguras
Vectores
Diferencias con C
Punteros
Puntero a constante
Puntero constante
Asignación y comprobación de tipos
Argumentos de funciones y valores de retorno
Paso por valor constante
Retorno por valor constante
Paso y retorno de direcciones
Clases
const en las clases
Las constantes en tiempo de compilación dentro de las clases.
Objetos y métodos constantes
Volatile
Resumen
Ejercicios
8. Funciones inline
Los peligros del preprocesador
Macros y acceso
Funciones inline
inline dentro de clases
Funciones de acceso
Stash y Stack con inline
inline y el compilador
Limitaciones
Referencias adelantadas
Esconder actividades en contructores y destructores
Reducir el desorden
Más características del preprocesador
Construcción de símbolos
Chequeo mejorado de errores
Resumen
Ejercicios
9. Control de nombres
Los elementos estáticos de C
Variables estáticas dentro de funciones
Control del enlazado
Otros especificadores para almacenamiento de clases
Espacios de nombres
Crear un espacio de nombres
Cómo usar un espacio de nombres
El uso de los espacios de nombres
Miembros estáticos en C++
Definición del almacenamiento para miembros de datos estáticos
Clases anidadas y locales
Métodos estáticos
FIXME static initialization dependency
Qué hacer
Especificaciones de enlazado alternativo
Resumen
Ejercicios
10. Referencias y el constructor de copia
Punteros en C++
Referencias en C++
Referencias en las funciones
Consejos para el paso de argumentos
El constructor de copia
Paso y retorno por valor
Construcción por copia
Constructor copia por defecto
Alternativas a la construcción por copia
Punteros a miembros
Funciones
Resumen
Ejercicios
11. Creación dinámica de objetos
Creación de objetos
Asignación dinámica en C
Operador new
Operador delete
Un ejemplo sencillo
Trabajo extra para el gestor de memoria
Rediseño de los ejemplos anteriores
delete void* probablemente es un error
Responsabilidad de la limpieza cuando se usan punteros
Stash para punteros
new y delete para vectores
Cómo hacer que un puntero sea más parecido a un vector
Cuando se supera el espacio de almacenamiento
Sobrecarga de los operadores new y delete
Resumen
Ejercicios
12. Herencia y Composición
Sintaxis de la composición
Sintaxis de la herencia
Lista de inicializadores de un constructor
Inicialización de objetos miembros de una clase
Tipos predefinidos en la lista de inicializadores
Combinación de composición y herencia
Orden de llamada de constructores y destructores
Ocultación de nombres
Funciones que no heredan automáticamente
Herencia y métodos estáticos
Composición vs. herencia
Protected
Herencia protegida
Operadores de sobrecarga y herencia
Herencia múltiple
Desarrollo incremental
FIXME Upcasting
¿Por qué FIXME "upcasting"?
FIXME Upcasting y el constructor de copia
Composición vs. herencia FIXME (revisited)
FIXME Upcasting de punteros y referencias
Una crisis
Resumen
Ejercicios
13. Polimorfismo y Funciones virtuales
Evolución de los programadores de C++
Upcasting
El problema
Ligadura de las llamadas a funciones
Funciones virtuales
Extensibilidad
Cómo implementa C++ la ligadura dinámica
Almacenando información de tipo
Pintar funciones virtuales
Detrás del telón
Instalar el vpointer
Los objetos son diferentes
¿Por qué funciones virtuales?
Clases base abstractas y funciones virtuales puras
Definiciones virtuales puras
Herencia y la VTABLE
FIXME: Object slicing
Sobrecargar y redefinir
Tipo de retorno variante
funciones virtuales y constructores
Orden de las llamadas a los constructores
Comportamiento de las funciones virtuales dentro de los constructores
Destructores y destructores virtuales
Destructores virtuales puros
Mecanismo virtual en los destructores
Creación una jerarquía basada en objetos
Sobrecarga de operadores
Downcasting
Resumen
Ejercicios

Lista de ejemplos

13.1.
<xi:include></xi:include>