Volver a los cursos
AI013 Professional

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.

4.8
30.0h
318 estudiantes
2 me gusta
Inteligencia Artificial
Comenzar a aprender

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

  1. Identificar y verificar el entorno del compilador de C++ y la arquitectura objetivo utilizando herramientas de línea de comandos.
  2. Explicar la compatibilidad estándar y la historia de solapamiento entre C (C89, C99, C11) y C++ (C++98, C++1x).
  3. Implementar enlaces cruzados entre lenguajes mediante encabezados extern "C" y flujos de compilación de múltiples etapas.
  4. Resolver ambigüedades de punteros usando nullptr e implementar lógica de tiempo de compilación mediante constexpr y if constexpr.
  5. Simplificar declaraciones complejas usando auto, decltype y alias de tipo (using), asegurando un diseño orientado a objetos robusto con override y final.
  6. Diseñar código altamente genérico utilizando plantillas variádicas, expresiones de plegado y deducción de parámetros de plantilla no tipo.
  7. Definir e implementar expresiones Lambda usando diversos modos de captura (Valor, Referencia, Expresión y Genérica).
  8. Utilizar std::function y std::bind para crear envoltorios flexibles de funciones y aplicaciones parciales de funciones.
  9. Clasificar expresiones en Lvalues, Prvalues y Xvalues, y aplicar Semántica de Movimiento para optimizar la gestión de recursos de clases.
  10. Diferenciar entre los modelos de memoria y casos de uso de std::array (tamaño fijo, pila) y std::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 nullptr e implementar lógica en tiempo de compilación con constexpr y if constexpr.
  • Simplificar declaraciones complejas usando auto, decltype y alias de tipo (using), asegurando un diseño orientado a objetos robusto con override y final.
  • 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::function y std::bind para 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) y std::vector (tamaño dinámico, montículo).
  • Inicializar y gestionar correctamente std::array usando 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_ptr y std::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::regex y std::smatch para 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::mutex y envoltorios RAII (std::lock_guard, std::unique_lock).
  • Implementar flujos asincrónicos y comunicación entre hilos usando std::future, std::packaged_task y std::condition_variable.
  • Aplicar tipos std::atomic y seleccionar estrategias adecuadas de std::memory_order para 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::filesystem como 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 int para precisión extendida de enteros.
  • Aplicar el especificador noexcept para optimizar el manejo de excepciones y usar el operador noexcept para 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.