Programación moderna en C++
C++03 / C++11 / C++14 / C++17 / C++20 / C++23 / C++26
Este curso de acceso abierto está dirigido a aquellos que ya están familiarizados con C y la programación orientada a objetos para alcanzar un nivel de competencia en programación C++. El curso cubre los conceptos básicos de la programación en C++ y avanza hacia la semántica y los conceptos avanzados de C++.
Características clave :
- Gratis y actualizado frecuentemente
- 26 conferencias, más de 1800 diapositivas
- Incluir los últimos conceptos y características estándar del idioma.
- Enseñanza práctica : descripciones breves y estructuradas, no detalladas, asociadas con el código.
- Ejemplos de código mínimo para mostrar solo una característica o problema específico sin desviarse
- Aspectos complementarios del lenguaje : herramientas, convenciones de codificación, organización de proyectos y optimización de código.
- Basado en la experiencia : muchos aspectos, ejemplos y problemas provienen de casos del mundo real enfrentados durante mi trabajo como ingeniero de software.
Si disfrutas el curso o lo encuentras útil , añade una estrella.
CAPÍTULOS
# | TÍTULO | ENFOQUE PRINCIPAL |
---|
1 | Introducción (html) | Historia de C/C++, Áreas de aplicación, Introducción al curso |
2 | Preparación (html) | Libros, Cómo compilar, Hola mundo. |
3 | Conceptos Básicos I (html) | Sistema de tipos, tipos fundamentales y operadores |
4 | Conceptos Básicos II (html) | Tipos integrales y de coma flotante y su aritmética. |
5 | Conceptos Básicos III (html) | Entidades, Enumeradores, Estructuras, Declaraciones de flujo de control |
6 | Conceptos Básicos IV (html) | Montón, Pila, Punteros, Referencias, Propiedades constantes, Operadores de conversión |
7 | Conceptos Básicos V (html) | Funciones, expresiones Lambda, directivas de preprocesamiento |
8 | Programación orientada a objetos I (html) | Jerarquía de clases, constructor, destructor, palabras clave de clase |
9 | Programación Orientada a Objetos II (html) | Polimorfismo, sobrecarga de operadores. |
10 | Plantillas y Metaprogramación I (html) | Plantilla de función, rasgos de tipo, utilidades en tiempo de compilación |
11 | Plantillas y Metaprogramación II (html) | Plantilla de clase, SFINAE |
12 | Unidades de traducción I (html) | Regla de vinculación y una definición |
13 | Unidades de traducción II (html) | Manejo de múltiples unidades de traducción y archivos, #include , Módulos |
14 | Convenciones de código I (html) | Organización del proyecto, introducción a las convenciones de código, convenciones de entidades. |
15 | Convenciones de código II (html) | Plantilla, espacio de nombres, C++ moderno, mantenibilidad, denominación y convenciones de formato |
16 | Depuración y prueba (html) | Ejecución/depuración de memoria, Sanitizers, Técnicas de Harding, Pruebas unitarias, Desarrollo basado en pruebas |
17 | Ecosistema (html) | Cmake, documentación y otras herramientas |
18 | Utilidades (html) | Bibliotecas std principales |
19 | Contenedores, iteradores y algoritmos (html) | Contenedores, Iteradores, Algoritmos, Rangos |
20 | Temas Avanzados I (html) | Mover semántica, referencia universal, deducción de tipos |
21 | Temas Avanzados II (html) | Manejo de errores, modismos de C++, punteros inteligentes |
22 | Optimizaciones de rendimiento I (html) | Ley de Ahmdal, límites de rendimiento, conceptos de arquitectura (ILP, SIMD, etc.), jerarquía de memoria |
23 | Optimizaciones de rendimiento II (html) | Optimizaciones aritméticas, optimizaciones de memoria, etc. |
24 | Optimizaciones de rendimiento III (html) | Optimizaciones del compilador, creación de perfiles y herramientas de evaluación comparativa. |
25 | Diseño de software I (html) | Conceptos básicos, principios, casos de uso. |
26 | Diseño de software II (html) | Patrones de diseño y modismos |
LIBRO TODO EN UNO : modern-cpp.pdf (podría haber algunas confirmaciones detrás), html
TEMAS EN DETALLE
1. Introducción
- Un poco de historia de los lenguajes de programación C/C++
- Áreas de aplicación y popularidad
- Filosofía C++
- Debilidad de C++ : alternativas de C++, ¿por qué es difícil cambiar a un nuevo lenguaje?
- El curso
2. Preparación
- Libros y referencias
- Leyenda de diapositiva
- ¿Qué editor/IDE/compilador debo utilizar?
- ¿Cómo compilar?
- Hola mundo : flujo de E/S
3. Conceptos Básicos I - Sistema de Tipos, Tipos Fundamentales y Operadores
- El sistema de tipos de C++ : categorías de tipos, propiedades de tipos
- Descripción general de los tipos fundamentales de C++ : tipos aritméticos, sufijos y prefijos, tipos aritméticos no estándar, tipo
void
, nullptr
- Reglas de conversión
- palabra clave
auto
- Operadores C++ : precedencia de operadores, semántica de incremento/decremento de prefijo/postfijo, operadores de asignación, compuestos y coma, operador de nave espacial
<=>
, operadores de comparación seguros
4. Conceptos Básicos II - Tipos Integrales y de Punto Flotante
- Tipos de datos integrales : enteros de ancho fijo,
size_t
, ptrdiff_t
, uintptr_t
, semántica de operaciones aritméticas, promoción, truncamiento, comportamiento indefinido, aritmética de saturación - Tipos de punto flotante y aritmética : Estándar de punto flotante IEEE y otras representaciones, valores normales/anormales, infinito, no es un número (
NaN
), máquina Epsilon, unidades en el último lugar (ULP), hoja de referencia, límites y funciones útiles, aritmética. propiedades, Comportamiento de valores especiales, Comportamiento no definido, Detectar errores de punto flotante - Problemas de punto flotante : cancelación catastrófica, comparación de punto flotante
5. Conceptos Básicos III - Entidades y Flujo de Control
- Entidades
- Declaración y Definición
- Enumeradores
-
struct
, Bitfield, union
- Flujo de control : instrucción
if
, bucles for
y while
, bucle for
base de rango, switch
, goto
, evitar advertencia de variable no utilizada - Espacio de nombres : espacio de nombres global explícito, alias de espacio de nombres,
using
-declaración, using namespace
-directiva, espacio de nombres inline
- Atributos :
[[nodiscard]]
, [[maybe_unused]]
, [[deprecated]]
, [[noreturn]]
6. Conceptos Básicos IV - Conceptos de Memoria
- Punteros : operaciones de puntero, dirección del operador
&
, acceso a miembros struct
, puntero void
, conversión de puntero, aritmética de puntero, punteros salvajes y colgantes - Montón y pila : pila de memoria,
new
, delete
, asignación de ubicación sin asignación, asignación sin lanzamiento, pérdida de memoria - Inicialización : inicialización de variables, inicialización uniforme, inicialización de matrices, inicialización de estructuras, enlace de estructuras, inicialización de memoria dinámica
- Referencias
- Expresiones
Const
y constantes : contenidos y literales, const
, constexpr
, consteval
, constinit
, if constexpr
, std::is constant evaluated()
, if consteval
- palabra clave
volatile
- Conversión de tipo explícita :
static_cast
, const_cast
, reinterpret_cast
, juego de palabras de tipo, std::bit_cast
, conversión de inicialización uniforme, gls::narrow_cast
- Operador
sizeof
: descripción general, [[no_unique_address]]
7. Conceptos Básicos V - Funciones y Preprocesamiento
- Funciones : paso por valor, paso por puntero, paso por referencia, firma de función y sobrecarga, sobrecarga y
=delete
, parámetros predeterminados - Puntero de función y objetos de función
- Expresiones Lambda : lista de captura, expresión Lambda y relación de función, notas de parámetros, componibilidad, recursividad,
constexpr/consteval
, template
, mutable
, [[nodiscard]]
, lista de captura y clases - Preprocesamiento : preprocesadores, errores comunes, macros de ubicación de origen, macros de compilación condicional, operador de cadena (
#
), #error
y #warning
, #pragma
, operador de pegado de tokens ##
, macro variable
8. Programación Orientada a Objetos I - Conceptos de Clase
- Clases de C++ : modismo RAII
- Jerarquía de clases
- Especificadores de acceso : especificadores de acceso de herencia, ¿cuándo se utilizan
public/protected/private
para los miembros de datos? - Constructor de clase : constructor predeterminado, inicialización de clase, inicialización uniforme para objetos, constructor delegado, palabra clave
explicit
, [[nodiscard]]
y clases - Constructor de copias
- Destructor de clases
- Constructores, destructores y operadores predeterminados (
= default
) - Palabras clave de clase :
this
, static
, const
, mutable
, using
, friend
, delete
9. Programación orientada a objetos II: polimorfismo y sobrecarga de operadores
- Polimorfismo : Mecanismos de C++ para polimorfismo, métodos
virtual
, tabla virtual, palabra clave override
, palabra clave final
, errores comunes, método virtual puro, clase abstracta e interfaz. - Transmisión de herencia e identificación del tipo de tiempo de ejecución
- Sobrecarga de operadores : descripción general, operador de comparación
<
, operador de nave espacial <=>
, operador de subíndice []
, operador de subíndice multidimensional []
, operador de llamada de función ()
, operador estático []
y operador ()
, operador de conversión T()
, sobrecarga de tipo de retorno resolución, operadores de incremento y decremento ++
/ --
, operador de asignación =
, operador de flujo <<
, notas del operador - Diseño de objetos C++ : agregado, clase trivial, clase de diseño estándar, datos antiguos simples (POD), jerarquía
10. Plantillas y metaprogramación I - Plantillas de funciones y utilidades en tiempo de compilación
- Plantilla de función : descripción general, creación de instancias de plantilla, parámetros de plantilla, parámetro de plantilla: valor predeterminado, sobrecarga, especialización
- Variable de plantilla
- Tipos de parámetros de plantilla : notas de tipo genérico, marcador de posición
auto
, tipo de parámetro de plantilla de clase, tipos de matriz y puntero, tipo de función - Utilidades en tiempo de compilación :
static_assert
, using
palabra clave, palabra clave decltype
- Rasgos de tipo : descripción general, biblioteca de rasgos de tipo, manipulación de tipos
11. Plantillas y Metaprogramación II - Plantillas de Clase y SFINAE
- Plantilla de clase : especialización de clase, constructor de plantilla de clase
- Deducción automática de plantilla de constructor (CTAD)
- Plantilla de clase: conceptos avanzados : clase + función: especialización, nombres dependientes:
typename
y palabras clave template
, jerarquía de plantilla de clase y using
, palabra clave friend
, argumentos de plantilla de plantilla - Metaprogramación de plantillas
- SFINAE: La falla de sustitución no es un error : Función SFINAE, Clase SFINAE
- Plantilla Variadic : expresión plegable, plantilla de clase Variadic
- Conceptos de C++ 20 : descripción general, palabra clave
concept
, cláusula requires
, expresión requires
, expresión requires
+ cláusula, cláusula requires
+ expresión, requires
y constexpr
, requires
anidados - Depuración de plantillas
12. Unidades de traducción I - Regla de vinculación y definición única
- Conceptos Básicos : Unidad de traducción, Alcance local y global, Vinculación
- Clase de almacenamiento y duración : duración del almacenamiento, clase de almacenamiento, palabra clave
static
, espacio de nombres anónimo, palabras clave extern
- Vinculación de
const
y constexpr
: fiasco de orden de inicialización estática - Resumen de vinculación
- Manejo de múltiples unidades de traducción : clase en múltiples unidades de traducción
- Regla de una definición (ODR) : problemas de variables globales, ODR - Punto 3, funciones/variables
inline
, constexpr
e inline
- ODR - Plantilla de función : casos, palabra clave
extern
- ODR - Plantilla de clase : casos, palabra clave
extern
- Resumen y comportamiento indefinido de ODR
13. Unidades de traducción II: inclusión, módulo y espacio de nombres
-
#include
Problemas : incluir protección, declaración directa, dependencias circulares, errores de vinculación comunes - Módulos C++20 : descripción general, terminología, visibilidad y accesibilidad, tipos de unidades de módulo, palabras clave, fragmento de módulo global, fragmento de módulo privado, unidad de módulo de encabezado, particiones de módulo
- Compilación de varias unidades de traducción : indicadores fundamentales del compilador, métodos de compilación
- Bibliotecas en C++ : biblioteca estática, creación de bibliotecas estáticas, uso de bibliotecas estáticas, biblioteca dinámica, creación de bibliotecas dinámicas, uso de bibliotecas dinámicas, interfaz binaria de aplicaciones (ABI), control, búsqueda de dependencias de bibliotecas dinámicas, análisis de objetos/símbolos ejecutables
14. Convenciones del Código I
- Organización de proyectos C++ : directorios de proyectos, archivos de proyectos, notas de organización de proyectos "comunes", organización alternativa de proyectos "canónica"
- Estilos y convenciones de codificación : descripción general, estilos de codificación populares
- Archivos de encabezado y
#include
: #include
guard, #include
sintaxis, orden de #include
, convenciones comunes de encabezado/nombre de archivo fuente - Preprocesamiento : Macro, declaraciones de preprocesamiento
- Variables : variables globales
static
, conversiones. - Enumeradores
- Tipos aritméticos : tipos integrales con signo y sin signo, conversión de tipos integrales, tipos integrales: tamaño y otras cuestiones, tipos de punto flotante
- Funciones : parámetros de función, argumentos de función, valores de retorno de función, especificadores de función, expresiones lambda
- Estructuras y clases :
struct
vs class
, inicialización, listas de inicializadores reforzados, funciones de miembros especiales, =default
, =delete
, otros problemas, herencia, estilo
15. Convenios del Código II
-
auto
- Plantillas y tipo de deducción.
- Flujo de control : flujo de control redundante,
if/else
, comparación, switch
, for/while
- Espacio de nombres :
using namespace
, Espacio de nombres anónimo/sin nombre, Diseño de clases y espacios de nombres, Estilo - Funciones modernas de C++ : palabras clave, funciones, clase, biblioteca
- Mantenibilidad : comprensión de código, funciones, plantilla y depuración, biblioteca
- Portabilidad
- Denominación : entidades, variables, funciones, convenciones de estilo, aplicación de estilos de nomenclatura
- Legibilidad y formato : espaciado horizontal, punteros/referencias, espaciado vertical, llaves, decoradores de texto, reducción de la verbosidad del código, otros problemas
- Documentación de código : documentación de funciones, sintaxis de comentarios, documentación de archivos
16. Depuración y prueba
- Descripción general de la depuración
- Afirmaciones
- Depuración de ejecución : puntos de interrupción, puntos de vigilancia/puntos de captura, flujo de control, pila e información, impresión, desmontaje,
std::breakpoint
- Depuración de memoria :
valgrind
- Técnicas de refuerzo : uso de pila, comprobaciones de biblioteca estándar, protecciones de comportamiento indefinido, protecciones de flujo de control
- Desinfectantes : desinfectante de direcciones, desinfectante de fugas, desinfectante de memoria, desinfectante de comportamiento indefinido, desinfectante basado en muestreo
- Resumen de depuración
- Advertencias del compilador
- Análisis estático
- Pruebas de código : pruebas unitarias, desarrollo basado en pruebas (TDD), cobertura de código, pruebas fuzz
- Calidad del código :
clang-tidy
17. Ecosistema: Cmake y otras herramientas
- CMake :
cmake
y ctest
- Documentación del código :
doxygen
- Estadísticas de código : contar líneas de código, analizador de complejidad ciclomática
- Otras herramientas : formato de código -
clang-format
, Compiler Explorer
, transformación de código - CppInsights
, finalización de código con tecnología de IA - búsqueda de código local - ugrep
, ripgrep
, hypergrep
, motor de búsqueda de código - searchcode/grep.app
, evaluación comparativa de código - Quick-Bench
, Fuente para codificar
18. Utilidades
- Flujo de E/S : Manipulador,
ofstream/ifstream
- Cadenas :
std::string
, conversión de/a valores numéricos, std::string_view
, std::format
, std::print
- Ver :
std::span
- Bibliotecas de Matemáticas
- Número aleatorio : conceptos básicos, C++
<random>
, semilla, período y calidad de PRNG, distribución, algoritmos recientes y rendimiento, cuasi aleatorio - Medición del tiempo : tiempo del reloj de pared, tiempo del usuario, tiempo del sistema
- Plantillas de clases estándar :
std::pair
, std::tuple
, std::variant
, std::optional
, std::any
, std::stacktrace
- Biblioteca del sistema de archivos : métodos de consulta, métodos de modificación
19. Contenedores, iteradores y algoritmos
- Contenedores e iteradores
- Contenedores de secuencia :
std::array
, std::vector
, std::deque
, std::list
, std::forward_list
- Contenedores asociativos :
std::set
, std::map
, std::multiset
- Adaptadores de contenedor :
std::stack
, std::queue
, std::priority_queue
- Implementar un iterador personalizado : implementar un iterador simple
- Notas del iterador :
- Métodos de utilidad del iterador :
std::advance
, std::next
, std::prev
, std::distance
, métodos de acceso al contenedor, rasgos del iterador - Biblioteca de algoritmos :
std::find_if
, std::sort
, std::accumulate
, std::generate
, std::remove_if
- Rangos C++20 : Conceptos clave, Vista de rango, Adaptador de rango, Fábrica de rango, Algoritmos de rango, Acciones de rango
20. Temas Avanzados I
- Move Semantic : referencias de
lvalues
y rvalues
, Move semantic, std::move
, declaración de clase semántica - Referencia universal y reenvío perfecto : referencia universal, reglas de colapso de referencia, reenvío perfecto
- Categorías de valor
-
&
, &&
Ref-calificadores y sobrecarga volatile
- Copiar Elision y RVO
- Tipo Deducción : Pasar por referencia, Pasar por puntero, Pasar por valor, deducción
auto
, auto(x)
: Copia de decaimiento - corrección
const
21. Temas Avanzados II
- Comportamiento indefinido: comportamiento ilegal, comportamiento específico de la plataforma, comportamiento no especificado, detección de comportamiento indefinido
- Manejo de errores : manejo de errores recuperables, código de retorno, excepciones de C++, definición de excepciones personalizadas, palabra clave
noexcept
, problemas de asignación de memoria, código de retorno y resumen de excepciones, std::expected
, enfoques alternativos de manejo de errores - Punteros inteligentes :
std::unique_ptr
, std::shared_ptr
, std::weak_ptr
- Concurrencia : métodos de subprocesos, mutex, atómico, paralelismo basado en tareas
22. Optimización I - Conceptos básicos
- Introducción : Ley de Moore, Limitaciones de la Ley de Moore, Razones para optimizar
- Conceptos básicos : complejidad asintótica, equilibrio entre tiempo y memoria, ciclo de desarrollo, ley de Ahmdal, rendimiento, ancho de banda, latencia, límites de rendimiento, intensidad aritmética
- Conceptos básicos de arquitectura : rendimiento de instrucciones (IPC), ejecución en orden y fuera de orden, canalización de instrucciones, paralelismo a nivel de instrucciones (ILP), ley de Little, paralelismo a nivel de datos (DLP) e instrucciones vectoriales (SIMD). Paralelismo a nivel de subproceso (TLP), subprocesos múltiples de instrucción única (SIMT), RISC, conjuntos de instrucciones CISC
- Jerarquía de memoria : conceptos de jerarquía de memoria, localidad de memoria, latencia de núcleo a núcleo y afinidad de subprocesos, modelo de ordenación de memoria
23. Optimización II - Optimización de código
- Operaciones de E/S :
printf
, E/S asignadas en memoria, acelerar la carga de datos sin procesar - Optimizaciones de memoria : memoria de montón, memoria de pila, utilización de caché, alineación de datos, captación previa de memoria
- Tipos aritméticos : tipos de datos, operaciones aritméticas, conversión, punto flotante, funciones intrínsecas del compilador, valores en un rango, tabla de búsqueda
- Flujo de control : ramas, sugerencias de rama -
[[likely]]
/ [[unlikely]]
, enteros con/sin signo, bucles, elevación de bucle, desenrollado de bucle, aserciones, sugerencias del compilador [[assume]]/std::unreacheable()
, recursividad - Funciones : costo de llamada a función, paso de argumentos, inserción de funciones, atributos de función, alias de punteros
- Programación orientada a objetos
- Biblioteca estándar y otros aspectos del lenguaje
24. Optimización III: optimizaciones sin codificación y evaluación comparativa
- Optimizaciones del compilador : Acerca del compilador, Indicadores de optimización del compilador, Indicadores de optimización de punto flotante, Indicadores de optimización del vinculador, Indicadores de arquitectura, Ayuda al compilador a producir un mejor código, Optimización guiada por perfiles (PGO), Optimizador binario de posprocesamiento, Optimizaciones poliédricas
- Técnicas de transformación del compilador : transformaciones básicas, desconexión de bucles, fusión de bucles, fisión de bucles, intercambio de bucles, mosaico de bucles
- Bibliotecas y estructuras de datos
- Evaluación comparativa de rendimiento : ¿Qué probar?, Calidad de la carga de trabajo/conjunto de datos, Comportamiento de la caché, Rendimiento estable de la CPU, Consideraciones de subprocesos múltiples, Diseño de la memoria del programa, Gastos generales de medición, Optimizaciones del compilador, Evaluación de métricas
- Creación de perfiles :
gprof
, uftrace
, callgrind
, cachegrind
, perfilador perf
Linux - Computación paralela : simultaneidad versus paralelismo, escalamiento del rendimiento, ley de Gustafson, lenguajes de programación paralelos
25. Diseño de Software I - Conceptos Básicos (BORRADOR)
- Libros y referencias
- Conceptos básicos : abstracción, interfaz y módulo, clase invariante
- Principios de diseño de software : separación de preocupaciones, bajo acoplamiento, alta cohesión, encapsulación y ocultación de información, diseño por contrato, descomposición de problemas, reutilización de código
- Complejidad del software : entropía del software, deuda técnica
- Los principios de diseño SOLID
- Diseño de clases : el principio de la interfaz de clase, funciones miembro frente a funciones libres, funciones de espacio de nombres frente a métodos estáticos de clase
- Estudio de caso de BLAS GEMM
- Poseer objetos y vistas
- Valor versus semántica de referencia
- Variables globales
26. Diseño de software II: patrones y modismos de diseño (BORRADOR)
- Modismos de C++ : regla de cero, regla de tres, regla de cinco
- Patrón de diseño : Singleton, puntero a la implementación (PIMPL), patrón de plantilla curiosamente recurrente (CRTP), funciones virtuales de plantilla
Hoja de ruta
- Mejorar los capítulos de diseño de software
- Capítulo de aspectos de construcción (por ejemplo, reducir el tiempo de construcción)
¿Reportar errores? y contribuyendo
Si encuentra algún error tipográfico, conceptual o sección para mejorar, infórmelo utilizando el panel issue
.
Autor
Federico Busato
, https://federico-busato.github.io/
- LinkedIn: www.linkedin.com/in/federico-busato/
- Twitter: twitter.com/fedebusato