Volver a los cursos
AI037 Undergraduate

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.

5.0
57.0h
601 estudiantes
0 me gusta
Inteligencia Artificial

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

  1. Definir e implementar la función main y comprender su interacción con el sistema operativo.
  2. Ejecutar compilación desde línea de comandos y gestionar flujos de entrada/salida básicos (cin, cout).
  3. Aplicar sentencias de control de flujo para resolver problemas lógicos iterativos, como contar ocurrencias.
  4. Implementar estructuras lógicas para contar y procesar ocurrencias consecutivas de datos de entrada.
  5. Diferenciar entre operadores de asignación (=) y de igualdad (==) dentro de sentencias de control.
  6. Usar objetos de clase (Sales_item), acceder a funciones miembro mediante el operador punto y incluir archivos de cabecera personalizados.
  7. Distinguir entre tipos primitivos diferentes y predecir resultados de conversiones de tipo y desbordamientos aritméticos con enteros sin signo.
  8. Implementar características de C++11 como inicialización por lista, nullptr, constexpr y especificadores de deducción de tipo.
  9. Diferenciar entre declaraciones y definiciones de variables, y aplicar reglas de ámbito para gestionar la visibilidad de identificadores.
  10. 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 main y 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, constexpr y 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 const de alto nivel y bajo nivel, y constexpr para constantes de tiempo de compilación.
  • Implementar deducción de tipo de C++11 (auto y decltype) 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 using de 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, bucles for basados 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 string y vector.
  • 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 if y switch, resolviendo errores lógicos como el "else colgante".
  • Seleccionar y aplicar el constructo iterativo adecuado (while, for, for basado 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_list y 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 static de 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 fstream y sstream para 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 de vector.
  • Realizar manipulaciones complejas de cadenas y conversiones numéricas usando la biblioteca extendida de string y 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/delete manual a punteros inteligentes basados en RAII y la clase allocator.
  • 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::move para 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 function para 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 tuple para múltiples valores de retorno y bitset para 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.