Tutorial de C++ Moderno
Este tutorial tiene como objetivo proporcionar a los desarrolladores con experiencia una referencia rápida de las nuevas funciones de C++11/14/17/20. Cubre mejoras en la usabilidad del lenguaje, mejoras en tiempo de ejecución, nuevos contenedores, punteros inteligentes y gestión de memoria, expresiones regulares, programación concurrente y una vista previa de C++20.
Lecciones
Descripción del curso
📚 Resumen del contenido
Esta guía está diseñada para proporcionar a desarrolladores experimentados una referencia rápida sobre las nuevas características de C++11/14/17/20. El contenido abarca mejoras en usabilidad del lenguaje, mejoras en tiempo de ejecución, el uso de nuevos contenedores, punteros inteligentes y gestión de memoria, expresiones regulares, programación concurrente y una vista previa de C++20.
Ponete al día rápidamente con C++11/14/17/20 y atraviesa la puerta de entrada a la programación moderna en C++.
Autor: 欧长坤 (Ou Changkun)
Agradecimientos: Licenciado bajo la licencia CC BY-NC-ND 4.0, gracias a todos los colaboradores de GitHub y al apoyo de la comunidad relacionada.
🎯 Objetivos de aprendizaje
- Identificar y verificar el entorno del compilador de C++ y la arquitectura objetivo utilizando herramientas de línea de comandos.
- Explicar la compatibilidad estándar y la historia de solapamiento entre C (C89, C99, C11) y C++ (C++98, C++1x).
- Implementar enlaces cruzados entre lenguajes mediante encabezados
extern "C"y flujos de compilación de múltiples etapas. - Resolver ambigüedades de punteros usando
nullptre implementar lógica de tiempo de compilación medianteconstexpryif constexpr. - Simplificar declaraciones complejas usando
auto,decltypey alias de tipo (using), asegurando un diseño orientado a objetos robusto conoverrideyfinal. - Diseñar código altamente genérico utilizando plantillas variádicas, expresiones de plegado y deducción de parámetros de plantilla no tipo.
- Definir e implementar expresiones Lambda usando diversos modos de captura (Valor, Referencia, Expresión y Genérica).
- Utilizar
std::functionystd::bindpara crear envoltorios flexibles de funciones y aplicaciones parciales de funciones. - Clasificar expresiones en Lvalues, Prvalues y Xvalues, y aplicar Semántica de Movimiento para optimizar la gestión de recursos de clases.
- Diferenciar entre los modelos de memoria y casos de uso de
std::array(tamaño fijo, pila) ystd::vector(tamaño dinámico, montículo).
🔹 Lección 1: Evolución histórica de C++ y entorno
Resumen: Esta lección cubre la base técnica del entorno de desarrollo de C++ y su relación histórica con el lenguaje C. Detalla cómo los estándares de C++ (de C++98 a C++1x) se solapan con los estándares de C (de C89 a C11) y proporciona los mecanismos específicos, como extern "C", necesarios para compilar y vincular correctamente bases de código mixtas de C y C++.
Resultados de aprendizaje:
- Identificar y verificar el entorno del compilador de C++ y la arquitectura objetivo utilizando herramientas de línea de comandos.
- Explicar la compatibilidad estándar y la historia de solapamiento entre C (C89, C99, C11) y C++ (C++98, C++1x).
- Implementar enlaces funcionales entre lenguajes usando encabezados
extern "C"y flujos de compilación de múltiples etapas.
🔹 Lección 2: Usabilidad del lenguaje: Sintaxis moderna y plantillas
Resumen: Esta lección explora la evolución de C++ desde C++11 hasta C++20, centrándose en mejoras que aumentan la claridad del código, la seguridad de tipos y la flexibilidad de plantillas. Los estudiantes dominarán características modernas de sintaxis como la inferencia de tipos, la evaluación en tiempo de compilación con constexpr, y técnicas avanzadas de plantillas incluyendo plantillas variádicas y expresiones de plegado.
Resultados de aprendizaje:
- Resolver ambigüedades de punteros usando
nullptre implementar lógica en tiempo de compilación conconstexpryif constexpr. - Simplificar declaraciones complejas usando
auto,decltypey alias de tipo (using), asegurando un diseño orientado a objetos robusto conoverrideyfinal. - Diseñar código altamente genérico usando plantillas variádicas, expresiones de plegado y deducción de parámetros de plantilla no tipo.
🔹 Lección 3: Mejoras en tiempo de ejecución: Lambdas y Semántica de movimiento
Resumen: Esta lección cubre mejoras críticas en tiempo de ejecución introducidas en C++ moderno (C++11/14), centrándose en construcciones de programación funcional y gestión eficiente de recursos. Los estudiantes dominarán expresiones Lambda, incluyendo capturas genéricas y por expresión en C++14, y profundizarán en los mecanismos de Semántica de Movimiento, categorías de valores (Lvalues/Rvalues) y Redirección Perfecta para eliminar copias innecesarias en aplicaciones de alto rendimiento.
Resultados de aprendizaje:
- Definir e implementar expresiones Lambda usando diversos modos de captura (Valor, Referencia, Expresión y Genérica).
- Utilizar
std::functionystd::bindpara crear envoltorios de funciones flexibles y aplicaciones parciales de funciones. - Clasificar expresiones en Lvalues, Prvalues y Xvalues, y aplicar Semántica de Movimiento para optimizar la gestión de recursos en clases.
🔹 Lección 4: Contenedores modernos: std::array
Resumen: Esta lección presenta std::array, un contenedor introducido en C++11 como alternativa moderna a los arrays tradicionales de estilo C. Explora las ventajas de usar un contenedor de tamaño fijo que encapsula arrays crudos, ofreciendo una interfaz más segura, compatible con STL y asignación de memoria basada en pila.
Resultados de aprendizaje:
- Diferenciar entre los modelos de memoria y casos de uso de
std::array(tamaño fijo, pila) ystd::vector(tamaño dinámico, montículo). - Inicializar y gestionar correctamente
std::arrayusando funciones miembro como.size()y.empty(). - Aplicar algoritmos de la Biblioteca Estándar (STL) y bucles basados en rango a objetos
std::array.
🔹 Lección 5: Punteros inteligentes y gestión de memoria RAII
Resumen: Esta lección introduce el principio de adquisición de recursos es inicialización (RAII) como filosofía fundamental de la gestión de memoria en C++ moderno. Cubre la transición desde el manejo manual de punteros hacia una gestión automatizada usando std::unique_ptr para propiedad exclusiva, std::shared_ptr para compartir con conteo de referencias y std::weak_ptr para romper dependencias circulares.
Resultados de aprendizaje:
- Comprender y aplicar el principio RAII para garantizar que los recursos se liberen cuando salen de ámbito.
- Implementar modelos de propiedad compartida y exclusiva usando
std::shared_ptrystd::unique_ptr. - Identificar y resolver fugas de memoria causadas por referencias circulares usando
std::weak_ptr.
🔹 Lección 6: Expresiones regulares y análisis de cadenas
Resumen: Esta lección cubre la implementación de expresiones regulares usando la biblioteca estándar de C++11 (std::regex) y sus aplicaciones prácticas en el análisis de solicitudes HTTP. Los estudiantes aprenderán la sintaxis de cuantificadores regex, el uso de std::smatch para capturar resultados y la integración arquitectónica de estas herramientas dentro de un entorno de servidor web basado en plantillas.
Resultados de aprendizaje:
- Identificar y aplicar caracteres especiales de expresiones regulares (cuantificadores) para definir patrones de cadena.
- Utilizar
std::regexystd::smatchpara validar nombres de archivos y extraer datos de cadenas. - Implementar lógica principal del servidor, incluyendo el análisis de solicitudes HTTP y mapeo de recursos usando modelos de memoria y contenedores modernos en C++.
🔹 Lección 7: Paralelismo, concurrencia y modelos de memoria
Resumen: Esta lección aborda el cambio fundamental en C++11 hacia un modelo de multi-hilo estandarizado. Transita desde la gestión básica de hilos y bloqueo basado en RAII hasta primitivas de sincronización avanzadas como futuros y variables condición, concluyendo con el riguroso modelo de memoria C++11, operaciones atómicas y garantías de consistencia de memoria.
Resultados de aprendizaje:
- Gestionar ciclos de vida de hilos y proteger recursos compartidos usando
std::thread,std::mutexy envoltorios RAII (std::lock_guard,std::unique_lock). - Implementar flujos asincrónicos y comunicación entre hilos usando
std::future,std::packaged_taskystd::condition_variable. - Aplicar tipos
std::atomicy seleccionar estrategias adecuadas destd::memory_orderpara garantizar visibilidad de memoria y prevenir reordenamientos de instrucciones ilegales.
🔹 Lección 8: Biblioteca estándar: Actualizaciones de filesystem
Resumen: Esta lección explora la evolución de la Biblioteca Estándar de C++, centrándose en las funciones de alto nivel introducidas en C++11 y estándares posteriores. Destaca la transición desde implementaciones específicas de plataforma o de bajo nivel hacia utilidades estandarizadas de alto nivel como std::filesystem y herramientas de concurrencia.
Resultados de aprendizaje:
- Identificar los componentes clave de concurrencia añadidos a la Biblioteca Estándar en C++11.
- Reconocer
std::filesystemcomo una importante adición para la gestión moderna de rutas y archivos. - Entender el papel de las abstracciones de alto nivel en la modernización del desarrollo en C++.
🔹 Lección 9: Características modernas misceláneas
Resumen: Esta lección cubre una selección de características impactantes introducidas en C++11 y refinadas en estándares posteriores para mejorar la seguridad de tipos, el rendimiento y la legibilidad del código. Los estudiantes aprenderán sobre el tipo long long int, las especificaciones de excepciones con noexcept, literales mejorados de cadenas y literales definidos por el usuario, y el control fino del alineamiento de memoria mediante alignof y alignas.
Resultados de aprendizaje:
- Identificar e implementar el tipo
long long intpara precisión extendida de enteros. - Aplicar el especificador
noexceptpara optimizar el manejo de excepciones y usar el operadornoexceptpara consultar la seguridad de una función. - Utilizar literales de cadena sin formato para simplificar definiciones de cadenas complejas y crear literales definidos por el usuario para sufijos personalizados de tipos.
🔹 Lección 10: C++20: El futuro del lenguaje
Resumen: Esta lección introduce las "cuatro grandes columnas" de C++20: Conceptos, Módulos, Corrutinas y Rangos. Estas características representan la evolución más significativa del lenguaje desde C++11, enfocándose en mejorar la seguridad de plantillas, la eficiencia de compilación, la programación asíncrona y el procesamiento de datos con estilo funcional.
Resultados de aprendizaje:
- Identificar y describir las cuatro características principales introducidas en el estándar C++20.
- Explicar el papel de los Conceptos y Restricciones en mejorar el manejo de errores de plantillas y el diseño.
- Diferenciar entre el enfoque tradicional basado en encabezados y el nuevo sistema de Módulos.