Guía de C++, Quinta edición
Una guía completa y autorizada sobre C++, completamente reescrita para el estándar C++11. Este curso cubre todo, desde los elementos básicos del lenguaje hasta las complejas facilidades de la biblioteca y herramientas avanzadas para la creación de clases.
Descripción del curso
📚 Resumen del contenido
Una guía completa y autorizada sobre C++, completamente reescrita para el estándar C++11. Este curso cubre todo, desde los elementos básicos del lenguaje hasta facilidades avanzadas de la biblioteca y herramientas de creación de clases.
La guía definitiva de la industria para dominar el programación moderna en C++11.
Autor: Stanley B. Lippman, Josée Lajoie, Barbara E. Moo
Agradecimientos: Dave Abrahams, Andy Koenig, Stephan T. Lavavej, Jason Merrill, John Spicer, Herb Sutter, Bjarne Stroustrup, Alex Stepanov, y miembros del comité de estandarización.
🎯 Objetivos de aprendizaje
- Definir e implementar la función
mainy comprender su interacción con el sistema operativo. - Ejecutar compilación desde línea de comandos y gestionar flujos de entrada/salida básicos (
cin,cout). - Aplicar sentencias de control de flujo para resolver problemas lógicos iterativos, como contar ocurrencias.
- Implementar estructuras lógicas para contar y procesar ocurrencias consecutivas de datos de entrada.
- Diferenciar entre operadores de asignación (
=) y de igualdad (==) dentro de sentencias de control. - Usar objetos de clase (
Sales_item), acceder a funciones miembro mediante el operador punto y incluir archivos de cabecera personalizados. - Distinguir entre tipos primitivos diferentes y predecir resultados de conversiones de tipo y desbordamientos aritméticos con enteros sin signo.
- Implementar características de C++11 como inicialización por lista,
nullptr,constexpry especificadores de deducción de tipo. - Diferenciar entre declaraciones y definiciones de variables, y aplicar reglas de ámbito para gestionar la visibilidad de identificadores.
- Distinguir entre referencias y punteros, y utilizar
void*para manejo genérico de memoria.
🔹 Lección 1: Introducción a C++ y Entrada/Salida básica
Resumen: Esta lección introduce la estructura fundamental de un programa en C++, centrándose en la función main, tipos de datos básicos y el proceso de compilación. Cubre operaciones esenciales de Entrada/Salida (I/O) usando la biblioteca iostream, la implementación de lógica mediante bucles while y for, y concluye con una introducción a conceptos orientados a objetos a través de la clase Sales_item.
Resultados de aprendizaje:
- Definir e implementar la función
mainy comprender su interacción con el sistema operativo. - Ejecutar compilación desde línea de comandos y gestionar flujos de entrada/salida básicos (
cin,cout). - Aplicar sentencias de control de flujo para resolver problemas lógicos iterativos, como contar ocurrencias.
🔹 Lección 2: Flujo de control y conceptos básicos de clases
Resumen: Esta lección pasa del control de flujo básico al poder fundamental del C++: las clases. Los estudiantes dominarán la lógica necesaria para procesar secuencias de datos (contando ocurrencias consecutivas) y aprenderán a usar la clase Sales_item para manejar estructuras de datos complejas tan fácilmente como tipos integrados. La unidad concluye con la implementación de un programa funcional de Librería, integrando redirección de archivos y reporte de errores.
Resultados de aprendizaje:
- Implementar estructuras lógicas para contar y procesar ocurrencias consecutivas de datos de entrada.
- Diferenciar entre operadores de asignación (
=) y de igualdad (==) dentro de sentencias de control. - Usar objetos de clase (
Sales_item), acceder a funciones miembro mediante el operador punto y incluir archivos de cabecera personalizados.
🔹 Lección 3: Tipos primitivos y variables
Resumen: Esta lección establece los bloques fundamentales de la programación en C++, explorando tipos aritméticos, ciclos de vida de variables y el modelo de memoria. Los estudiantes dominarán los matices de conversiones de tipo (especialmente tipos sin signo), la sintaxis de inicialización por lista de C++11 y las distinciones críticas entre punteros y referencias. La lección concluye con sistemas de tipos avanzados que incluyen calificadores const, deducción de tipo (auto, decltype) y la implementación de estructuras de datos personalizadas robustas usando protectores de preprocesador.
Resultados de aprendizaje:
- Distinguir entre diferentes tipos primitivos y predecir resultados de conversiones de tipo y desbordamientos aritméticos con enteros sin signo.
- Implementar características de C++11 como inicialización por lista,
nullptr,constexpry especificadores de deducción de tipo. - Diferenciar entre declaraciones y definiciones de variables, y aplicar reglas de ámbito para gestionar la visibilidad de identificadores.
🔹 Lección 4: Tipos compuestos y calificadores de tipo modernos
Resumen: Esta lección explora el sofisticado sistema de tipos de C++11, centrándose en cómo los tipos compuestos (punteros y referencias) interactúan con calificadores de tipo como const y constexpr. Los estudiantes dominarán los matices de deducción de tipo usando auto y decltype, y aprenderán a encapsular datos dentro de estructuras personalizadas protegidas por guardas de archivo de cabecera.
Resultados de aprendizaje:
- Distinguir entre referencias y punteros, y utilizar
void*para manejo genérico de memoria. - Categorizar y aplicar calificaciones
constde alto nivel y bajo nivel, yconstexprpara constantes de tiempo de compilación. - Implementar deducción de tipo de C++11 (
autoydecltype) para escribir código flexible y mantenible.
🔹 Lección 5: Cadenas y vectores de la biblioteca
Resumen: Esta lección cubre los tipos fundamentales de la Biblioteca Estándar de C++ string y vector, que ofrecen alternativas más flexibles y seguras que los tipos integrados. Los estudiantes aprenderán a gestionar el acceso a espacios de nombres mediante declaraciones using, inicializar y manipular cadenas y contenedores de longitud variable, y usar bucles for basados en rango e iteradores para procesar colecciones de datos de forma eficiente.
Resultados de aprendizaje:
- Simplificar el código usando declaraciones
usingde espacio de nombres mientras evitan trampas comunes en archivos de cabecera. - Realizar inicializaciones robustas de cadenas y vectores, incluyendo inicialización por lista de C++11.
- Implementar procesamiento a nivel de carácter y crecimiento dinámico de contenedores usando
push_back, buclesforbasados en rango y operaciones básicas de iteradores.
🔹 Lección 6: Iteradores y matrices integradas
Resumen: Esta lección cubre los mecanismos fundamentales para navegar y gestionar secuencias en C++11. Avanza desde herramientas modernas de alto nivel como iteradores para string y vector hasta matrices integradas de bajo nivel, aritmética de punteros y cadenas de estilo C. Los estudiantes aprenderán a conectar código heredado basado en matrices con contenedores modernos de la biblioteca estándar y gestionar estructuras multidimensionales complejas.
Resultados de aprendizaje:
- Usar iteradores y aritmética de iteradores para navegar y manipular contenedores
stringyvector. - Definir, inicializar y navegar matrices integradas usando aritmética de punteros y funciones de biblioteca
begin/end. - Implementar operaciones de cadena de estilo C y conectar seguramente matrices integradas con tipos de biblioteca modernos.
🔹 Lección 7: Expresiones, operadores y conversiones
Resumen: Esta lección cubre los bloques fundamentales de expresiones en C++, centrándose en cómo el lenguaje evalúa operaciones y gestiona tipos de datos. Los estudiantes dominarán la distinción entre valores lvalue y rvalue, las reglas de precedencia y asociatividad de operadores, y los mecanismos de operaciones aritméticas, lógicas y bit a bit. Además, la lección ofrece un análisis profundo de la gestión de tipos en C++, incluyendo conversiones aritméticas implícitas y la aplicación segura de conversiones explícitas nombradas.
Resultados de aprendizaje:
- Distinguir entre lvalues (identidad de objeto) y rvalues (valor de objeto) y comprender su papel en expresiones.
- Predecir el orden de evaluación de expresiones complejas usando precedencia, asociatividad y lógica de cortocircuito.
- Realizar manipulación de datos de bajo nivel usando operadores bit a bit y gestionar seguridad de tipo mediante conversiones implícitas y conversiones explícitas nombradas.
🔹 Lección 8: Enunciados avanzados y manejo de excepciones
Resumen: Esta lección cubre las estructuras esenciales de control de flujo en C++, desde tipos básicos de enunciados y reglas de alcance hasta lógica condicional y iterativa avanzada. También introduce técnicas sólidas de manejo de errores usando mecanismos de manejo de excepciones de C++ y la jerarquía de excepciones de la biblioteca estándar.
Resultados de aprendizaje:
- Distinguir entre enunciados nulos, simples y compuestos y gestionar el alcance de variables dentro de estas estructuras.
- Implementar tomas de decisiones complejas usando enunciados
ifyswitch, resolviendo errores lógicos como el "else colgante". - Seleccionar y aplicar el constructo iterativo adecuado (
while,for,forbasado en rango,do while) para tareas de programación específicas.
🔹 Lección 9: Diseño de funciones y paso de argumentos
Resumen: Esta lección cubre la arquitectura de funciones en C++, centrándose en cómo se pasan datos hacia y desde bloques de código modulares. Explora el ciclo de vida de objetos locales, los mecanismos de paso de argumentos (por valor vs. por referencia) y el estándar C++11 para manejar parámetros variables. Dominar estos conceptos permite a los programadores escribir código eficiente, reutilizable y seguro respecto a la memoria.
Resultados de aprendizaje:
- Distinguir entre métodos de inicialización de parámetros y su impacto en rendimiento e integridad de datos.
- Implementar interfaces de funciones robustas usando calificadores
const,initializer_listy técnicas de paso de matrices. - Gestionar eficazmente el ciclo de vida de objetos usando duraciones de almacenamiento automático y estático.
🔹 Lección 10: Funcionalidad avanzada y sobrecarga
Resumen: Esta lección cubre los mecanismos intrincados de funciones en C++, centrándose en el paso de parámetros, el ciclo de vida de objetos y la complejidad de la sobrecarga de funciones. Los estudiantes dominarán características de C++11 como initializer_list para parámetros variables, funciones constexpr y la declaración y uso de punteros a funciones para crear código flexible y modular.
Resultados de aprendizaje:
- Diferenciar entre paso por valor y paso por referencia e identificar cuándo usar parámetros
const. - Aplicar las reglas de resolución de sobrecarga para determinar la "mejor coincidencia" entre funciones candidatas y viables.
- Implementar y gestionar punteros a funciones, incluyendo su uso en contenedores como vectores y como tipos de retorno.
🔹 Lección 11: Encapsulamiento de clases y constructores
Resumen: Esta lección cubre la transición de estructuras de datos simples a Tipos de Datos Abstractos (ADT) en C++. Se enfoca en los mecanismos de diseño de clases, incluyendo funciones miembro, el puntero implícito this y el papel crítico de los constructores en la inicialización de objetos. Además, explora el encapsulamiento mediante control de acceso (public/private) y el uso de "amigos" para mantener una interfaz limpia mientras oculta detalles de implementación.
Resultados de aprendizaje:
- Diseñar e implementar una clase en C++ (como
Sales_data) que separa su interfaz de su implementación. - Dominar las reglas de inicialización de objetos usando constructores predeterminados, sobrecargados y explícitos.
- Aplicar especificadores de acceso y amistad para asegurar el encapsulamiento y gestionar el alcance de la clase.
🔹 Lección 12: Alcance de clase y gestión de conversiones
Resumen: Esta lección cubre los mecanismos avanzados del diseño de clases en C++, centrándose en la transición de estructuras de datos simples a Tipos de Datos Abstractos (ADT) robustos. Temas clave incluyen la gestión de la inicialización de objetos a través de distintos tipos de constructores, el control de conversiones implícitas usando la palabra clave explicit, y el entendimiento de entidades a nivel de clase como miembros static y clases literales.
Resultados de aprendizaje:
- Diseñar e implementar clases encapsuladas (ADT) usando especificadores de acceso y declaraciones de amigo.
- Gestionar conversiones implícitas de tipo de clase y suprimirlas usando la palabra clave
explicit. - Implementar e inicializar miembros
staticde clase para la gestión de datos a nivel de clase.
🔹 Lección 13: Entrada/Salida con flujos y conceptos básicos de contenedores secuenciales
Resumen: Esta lección cubre los mecanismos fundamentales del sistema de I/O de la biblioteca estándar de C++ y los contenedores secuenciales. Los estudiantes aprenderán a gestionar estados de condiciones de flujo y búferes de salida, realizar I/O con archivos y cadenas, y navegar los contenedores secuenciales de la biblioteca. La lección enfatiza conceptos críticos como rangos de iteradores, inicialización de contenedores y las implicaciones de rendimiento en la gestión de memoria de contenedores.
Resultados de aprendizaje:
- Interrogar y restablecer estados de condiciones de flujo y controlar el vaciado de búferes de salida para gestionar la integridad del flujo.
- Utilizar
fstreamysstreampara manejo persistente y en memoria de datos usando diversos modos de archivo. - Elegir contenedores secuenciales apropiados según patrones de acceso y sobrecarga de memoria para optimizar la selección.
🔹 Lección 14: Operaciones de contenedores y algoritmos genéricos
Resumen: Esta lección cubre la gestión de contenedores secuenciales de C++ y la aplicación de algoritmos genéricos para procesar datos independientemente del tipo de contenedor. Explora cómo los contenedores gestionan el crecimiento de memoria y el ciclo de vida de elementos, junto con el uso de lambdas y ligadores de funciones para personalizar algoritmos de la biblioteca. Los estudiantes dominarán la arquitectura de la biblioteca, incluyendo categorías de iteradores y algoritmos especializados.
Resultados de aprendizaje:
- Gestionar ciclos de vida de contenedores usando operaciones especializadas para
forward_list, técnicas de redimensionamiento y gestión de capacidad devector. - Realizar manipulaciones complejas de cadenas y conversiones numéricas usando la biblioteca extendida de
stringy adaptadores de contenedores. - Implementar algoritmos genéricos para leer, escribir y reordenar datos mientras personalizan el comportamiento mediante predicados, expresiones lambda y
std::bind.
🔹 Lección 15: Contenedores asociativos y punteros inteligentes
Resumen: Esta lección cubre el estándar C++11 para contenedores asociativos y gestión de memoria dinámica. Detalla el uso de contenedores ordenados y no ordenados para recuperación eficiente basada en claves y la implementación de código robusto y seguro frente a excepciones usando punteros inteliges. La lección concluye con el diseño de una aplicación real de consulta de texto que integra estas estructuras de datos complejas.
Resultados de aprendizaje:
- Implementar y manipular contenedores asociativos usando técnicas eficientes de búsqueda, inserción y subscriptación.
- Dominar la gestión de memoria dinámica al pasar de
new/deletemanual a punteros inteligentes basados en RAII y la claseallocator. - Diseñar sistemas complejos que compartan datos de forma segura entre clases usando contadores de referencias y propiedad de punteros inteligentes.
🔹 Lección 16: Gestión de recursos y semántica de movimiento
Resumen: Esta lección explora cómo las clases de C++ controlan el ciclo de vida de sus recursos mediante las "Cinco funciones especiales". Los estudiantes aprenderán a gestionar memoria dinámica usando estrategias de tipo valor y tipo puntero, implementar el idiom seguro ante excepciones de copia y cambio, y optimizar el rendimiento usando semántica de movimiento y referencias rvalue de C++11.
Resultados de aprendizaje:
- Implementar y explicar la Regla del Tres/Cinco para garantizar una gestión adecuada de recursos y prevenir fugas de memoria.
- Distinguir entre comportamientos de tipo valor y tipo puntero en clases e implementar contadores de referencias.
- Aplicar la semántica de movimiento usando referencias rvalue y
std::movepara eliminar copias profundas innecesarias de objetos grandes.
🔹 Lección 17: Sobrecarga de operadores e herencia (POO)
Resumen: Esta lección explora la extensión de la sintaxis del lenguaje mediante sobrecarga de operadores y la construcción de sistemas extensibles mediante Programación Orientada a Objetos (POO). Los estudiantes aprenderán a diseñar clases que se integren con operaciones integradas mientras dominan los mecanismos de herencia, enlace dinámico y jerarquías polimórficas de clases.
Resultados de aprendizaje:
- Diseñar e implementar operadores sobrecargados que sigan convenciones de la biblioteca estándar de C++.
- Crear y utilizar objetos funcionales y el tipo envoltorio
functionpara unificar entidades invocables. - Construir jerarquías de herencia robustas usando funciones virtuales, clases base abstractas y especificadores de acceso de C++11.
🔹 Lección 18: Plantillas y programación genérica
Resumen: Esta lección cubre los mecanismos fundamentales y avanzados de plantillas en C++, proporcionando la base para la programación genérica. Los estudiantes pasarán de definir plantillas de función y clase básicas a dominar características específicas de C++11 como plantillas variádicas, derivación perfecta y especialización de plantillas.
Resultados de aprendizaje:
- Definir e instanciar plantillas de función y clase usando tanto parámetros de tipo como parámetros no de tipo.
- Gestionar el modelo de compilación de plantillas y controlar la instanciación en múltiples archivos usando
extern template. - Implementar técnicas avanzadas de deducción, incluyendo tipos de retorno posteriores y derivación perfecta con
std::forward.
🔹 Lección 19: Herramientas especializadas de la biblioteca y sistemas grandes
Resumen: Esta lección cubre componentes avanzados de la biblioteca estándar de C++11 y características del lenguaje diseñadas para desarrollo de sistemas complejos. Cubre estructuras de datos especializadas, patrones de coincidencia robustos mediante la biblioteca regex, y herramientas arquitectónicas para programación a gran escala. Además, explora manejo avanzado de excepciones, gestión de espacios de nombres y la complejidad de la herencia múltiple.
Resultados de aprendizaje:
- Utilizar
tuplepara múltiples valores de retorno ybitsetpara gestión eficiente de banderas a nivel de bits. - Implementar coincidencia compleja de patrones de cadenas, validación y transformación usando la biblioteca
regex. - Generar números aleatorios de alta calidad usando motores y distribuciones manteniendo estado y semilla adecuados.