Searching...
Español
EnglishEnglish
EspañolSpanish
简体中文Chinese
FrançaisFrench
DeutschGerman
日本語Japanese
PortuguêsPortuguese
ItalianoItalian
한국어Korean
РусскийRussian
NederlandsDutch
العربيةArabic
PolskiPolish
हिन्दीHindi
Tiếng ViệtVietnamese
SvenskaSwedish
ΕλληνικάGreek
TürkçeTurkish
ไทยThai
ČeštinaCzech
RomânăRomanian
MagyarHungarian
УкраїнськаUkrainian
Bahasa IndonesiaIndonesian
DanskDanish
SuomiFinnish
БългарскиBulgarian
עבריתHebrew
NorskNorwegian
HrvatskiCroatian
CatalàCatalan
SlovenčinaSlovak
LietuviųLithuanian
SlovenščinaSlovenian
СрпскиSerbian
EestiEstonian
LatviešuLatvian
فارسیPersian
മലയാളംMalayalam
தமிழ்Tamil
اردوUrdu
The C++ Programming Language

The C++ Programming Language

por Bjarne Stroustrup 1986 1030 páginas
4.10
4.0K calificaciones
Escuchar
Try Full Access for 7 Days
Unlock listening & more!
Continue

Puntos clave

1. C++: Un Lenguaje para Abstracciones Elegantes y Eficientes

C++ es un lenguaje diseñado para desarrollar y utilizar abstracciones que sean a la vez elegantes y eficientes.

Doble Naturaleza. C++ nace para cerrar la brecha entre el acceso directo al hardware y los dominios de problemas de alto nivel. Hereda la eficiencia de C para programación de sistemas, pero añade mecanismos de abstracción potentes inspirados en Simula. Su objetivo es ofrecer un lenguaje que sea tanto rápido como expresivo, permitiendo a los programadores representar conceptos directamente en el código.

  • Mapeo directo al hardware
  • Mecanismos de abstracción accesibles
  • Lenguaje de propósito general
  • Enfoque hacia la programación de sistemas

Cero Sobrecarga. Un principio fundamental en el diseño de C++ es el “principio de cero sobrecarga”: no pagas por lo que no usas. Las características del lenguaje y las abstracciones básicas están diseñadas para ser tan eficientes como el código escrito a mano. Esto es crucial para aplicaciones donde el rendimiento es vital y para software de infraestructura.

  • La eficiencia es primordial
  • Sin costos implícitos por características no usadas
  • Permite uso en entornos con recursos limitados

Expresar Ideas. El lenguaje busca ayudar a los programadores a expresar ideas de forma clara y directa en el código. Esto implica representar conceptos como tipos, relaciones como jerarquías o parametrizaciones, y mantener ideas independientes separadas. Se fomenta la síntesis de distintos estilos de programación para lograr las mejores soluciones.

  • Expresar ideas directamente
  • Representar relaciones
  • Mantener ideas independientes separadas
  • Ideas simples, expresadas de forma simple

2. C++ Moderno (C++11) es un Lenguaje Mejor

C++ se siente como un lenguaje nuevo.

Evolución Significativa. El lenguaje C++ ha experimentado mejoras dramáticas a lo largo de los años, especialmente con el estándar C++11. Estos cambios han convertido a C++ en una herramienta mucho más poderosa y pulida para escribir software de calidad. El C++ moderno permite expresar ideas de forma más clara, sencilla y directa.

  • C++11 frente a C++98
  • Mayor expresividad
  • Mejoras en seguridad y rendimiento

Características Clave. C++11 introdujo una gran cantidad de características que cambiaron fundamentalmente la forma de escribir y usar C++. Incluye mejor soporte para concurrencia, gestión de recursos y programación genérica, además de facilidades sintácticas que reducen el código repetitivo.

  • Soporte para concurrencia (std::thread, std::mutex)
  • Semántica de movimiento (std::move, referencias rvalue)
  • Punteros inteligentes (unique_ptr, shared_ptr)
  • Lambdas
  • auto y constexpr
  • Listas de inicialización

Adoptar Estilos Modernos. Se recomienda encarecidamente a los programadores adoptar las características y estilos modernos de C++. Mantenerse en estilos antiguos de C++98 o C puede resultar en código de menor calidad, menos mantenible y potencialmente menos eficiente. El estándar garantiza compatibilidad hacia atrás, pero el progreso es inevitable.

3. Clases: La Base de la Abstracción

La característica central del lenguaje C++ es la clase.

Tipos Definidos por el Usuario. Las clases son el mecanismo principal para crear tipos definidos por el usuario que representan conceptos del dominio del problema directamente en el código. Un conjunto bien elegido de clases facilita entender, razonar y modificar un programa.

  • Representar conceptos como tipos
  • Base de los mecanismos de abstracción
  • Mejoran la claridad y mantenibilidad del código

Encapsulación. Las clases permiten distinguir entre la interfaz pública (lo que los usuarios ven y usan) y los detalles privados de implementación (miembros de datos y funciones auxiliares). Esto garantiza ocultamiento de datos, uso consistente y permite cambiar la implementación sin afectar al código usuario.

  • Interfaz pública
  • Implementación privada
  • Ocultamiento de datos
  • Separación de responsabilidades

Constructores y Destructores. Los constructores definen cómo se inicializan los objetos, asegurando que estén en un estado válido al crearse. Los destructores definen las acciones de limpieza al destruir un objeto, fundamentales para liberar recursos. Este par constructor/destructor es clave en técnicas de gestión de recursos como RAII.

  • Inicialización garantizada
  • Adquisición de recursos (constructores)
  • Liberación de recursos (destructores)
  • Invariantes de clase

4. Gestión de Recursos: RAII y Punteros Inteligentes

La combinación constructor/destructor es la base de muchas técnicas elegantes.

Principio RAII. La Adquisición de Recursos es Inicialización (RAII) es una técnica fundamental en C++ donde la adquisición de recursos se asocia a la inicialización del objeto (constructores) y la liberación al destruirlo (destructores). Esto asegura que los recursos se gestionen correctamente incluso ante excepciones o salidas anticipadas de funciones.

  • Adquisición de recursos en constructores
  • Liberación de recursos en destructores
  • Limpieza automática al salir del ámbito
  • Seguridad ante excepciones

Evitar Fugas. RAII ayuda a prevenir fugas de recursos (como memoria) y otros errores de gestión (borrado prematuro, doble borrado). Al encapsular la propiedad de recursos dentro de objetos, el compilador se encarga automáticamente de la limpieza.

  • Elimina el uso “desnudo” de new y delete
  • Previene fugas de memoria
  • Gestiona archivos, bloqueos, hilos, etc.

Punteros Inteligentes. unique_ptr y shared_ptr son punteros inteligentes de la biblioteca estándar que usan RAII para gestionar memoria dinámica. unique_ptr ofrece propiedad exclusiva, mientras que shared_ptr propiedad compartida mediante conteo de referencias. Son preferidos sobre punteros crudos para manejar objetos en el heap.

  • unique_ptr (propiedad exclusiva)
  • shared_ptr (propiedad compartida)
  • Desalojamiento automático de memoria
  • Evita llamadas manuales a delete

5. Plantillas: Habilitando la Programación Genérica

Una plantilla es una clase o función que parametrizamos con un conjunto de tipos o valores.

Parametrización en Tiempo de Compilación. Las plantillas permiten definir clases, funciones y alias de tipos parametrizados por tipos, valores u otras plantillas. Esto posibilita escribir código que funciona con una variedad de tipos sin sacrificar rendimiento.

  • Parametrizar por tipo o valor
  • Polimorfismo en tiempo de compilación
  • Generación de código

Programación Genérica. Las plantillas son la base de la programación genérica en C++, centrada en diseñar algoritmos y estructuras de datos que funcionan con cualquier tipo que cumpla ciertos requisitos (conceptos). Esto permite escribir código altamente reutilizable, seguro y eficiente.

  • Diseñar algoritmos generales
  • Trabajar con diversos tipos
  • Conceptos (requisitos sobre argumentos)

Eficiencia. Las plantillas son un mecanismo en tiempo de compilación, por lo que su uso no suele implicar sobrecarga en tiempo de ejecución respecto a código equivalente escrito a mano. Esto se logra mediante técnicas como la inserción en línea y el cálculo en tiempo de compilación.

  • Cero sobrecarga en tiempo de ejecución
  • Permite inserción en línea
  • Cálculo en tiempo de compilación

6. La Biblioteca Estándar: Tu Caja de Herramientas Esencial

Ningún programa significativo se escribe solo con un lenguaje de programación desnudo.

Componentes Esenciales. La biblioteca estándar ofrece un conjunto completo de componentes fundamentales, esenciales para casi cualquier programa en C++. Incluye contenedores, algoritmos, facilidades de entrada/salida, utilidades y soporte para concurrencia.

  • Contenedores (vector, list, map, set)
  • Algoritmos (sort, find, copy, unique)
  • Flujos de E/S (cin, cout, cerr)
  • Utilidades (pair, tuple, punteros inteligentes, tiempo)
  • Soporte para concurrencia

Fundamento. La biblioteca estándar está escrita en C++ mismo, demostrando el poder del lenguaje y sirviendo como modelo de buen diseño. Actúa como base común para otras bibliotecas y aplicaciones, promoviendo portabilidad e interoperabilidad.

  • Escrita en C++
  • Modelo de buen diseño
  • Promueve portabilidad
  • Facilita interoperabilidad

Preferir lo Estándar. Se recomienda encarecidamente usar componentes de la biblioteca estándar siempre que sea posible en lugar de reinventarlos. Los componentes estándar están bien diseñados, optimizados, ampliamente disponibles y conocidos, lo que reduce costos de mantenimiento y mejora la calidad del código.

  • No reinventar la rueda
  • Bien diseñados y optimizados
  • Ampliamente disponibles y conocidos

7. Concurrencia: Soporte Integrado para el Paralelismo

La concurrencia — la ejecución simultánea de varias tareas — se usa ampliamente para mejorar el rendimiento (usando varios procesadores para un cálculo) o la capacidad de respuesta (permitiendo que una parte del programa avance mientras otra espera).

Característica Moderna. C++ incluye soporte robusto, portátil y seguro en tipos para programación concurrente, atendiendo las necesidades del hardware moderno multinúcleo. Esto es una adición significativa en C++11.

  • Soporte integrado
  • Portátil y seguro en tipos
  • Atiende procesadores multinúcleo

Hilos y Tareas. La biblioteca ofrece gestión de hilos a bajo nivel (std::thread) y abstracciones de tareas a nivel superior (std::future, std::async). Los hilos comparten espacio de direcciones, requiriendo sincronización cuidadosa para evitar condiciones de carrera.

  • std::thread para hilos del sistema
  • Espacio de direcciones compartido
  • Concurrencia basada en tareas (std::async)

Sincronización. Se proporcionan mecanismos como mutexes (std::mutex) y variables de condición (std::condition_variable) para gestionar el acceso a datos compartidos y sincronizar hilos. Las operaciones atómicas ofrecen sincronización fina y sin bloqueos para tipos simples.

  • Mutexes y bloqueos
  • Variables de condición
  • Operaciones atómicas
  • Evitar condiciones de carrera

8. Dominar Tipos y Facilidades Básicas

Cada nombre y cada expresión tiene un tipo asociado.

Bloques Fundamentales. Entender los tipos incorporados de C++ (int, double, char, bool), cómo declarar variables, las reglas de ámbito y las sentencias básicas de control (if, switch, for, while) es fundamental. Estos elementos, heredados y mejorados de C, forman la base de todos los programas en C++.

  • Tipos incorporados
  • Declaraciones y ámbito
  • Sentencias de control
  • Expresiones y operadores

Seguridad de Tipos. C++ es un lenguaje con tipado estático, lo que significa que los tipos se verifican en tiempo de compilación. Esto ayuda a detectar errores temprano. Características como auto para deducción de tipos y constexpr para constantes en tiempo de compilación mejoran la seguridad y expresividad.

  • Verificación estática de tipos
  • Detectar errores temprano
  • auto para deducción de tipos
  • constexpr para constantes en tiempo de compilación

Punteros y Referencias. C++ ofrece punteros y referencias para acceso indirecto a memoria. Aunque poderosos, requieren gestión cuidadosa, especialmente con la propiedad de recursos. Los punteros inteligentes son preferidos sobre punteros crudos para manejar memoria dinámica.

  • Punteros y referencias
  • Acceso indirecto a memoria
  • Punteros inteligentes para propiedad

9. Combinar Estilos de Programación para Soluciones Efectivas

La mejor solución (más mantenible, legible, pequeña, rápida, etc.) para la mayoría de problemas no triviales suele ser aquella que combina aspectos de varios estilos.

Síntesis, No Exclusividad. C++ está diseñado para soportar múltiples estilos de programación: procedural, abstracción de datos, orientado a objetos y genérico. Las características del lenguaje permiten usar estos estilos en combinación, y las soluciones más efectivas suelen mezclar técnicas de varios paradigmas.

  • Programación procedural
  • Abstracción de datos
  • Programación orientada a objetos
  • Programación genérica

Evitar el Dogma. Enfocarse exclusivamente en un solo estilo o ver a C++ como un lenguaje “híbrido” pierde la potencia de su síntesis. El lenguaje ofrece herramientas que pueden usarse elegantemente en combinación para soportar una gran variedad de técnicas.

  • El lenguaje soporta combinaciones
  • Evitar pensamiento de un solo paradigma

Diseño Práctico. Programar efectivamente en C++ implica elegir las herramientas adecuadas (características del lenguaje, componentes estándar) del conjunto disponible y combinarlas apropiadamente para el problema. Esto requiere entender fortalezas y debilidades de distintos enfoques y cómo interactúan.

  • Elegir las herramientas correctas
  • Combinar características eficazmente
  • Enfocarse en diseño y técnicas

10. Manejo de Errores: Excepciones y Garantías

La noción de excepción existe para ayudar a transmitir información desde el punto donde se detecta un error hasta donde puede ser manejado.

Separar Responsabilidades. Las excepciones (throw, catch) ofrecen un mecanismo para separar el código que detecta un error del que lo maneja. Esto es especialmente útil en programas grandes y bibliotecas donde el detector no sabe cómo recuperarse y el manejador no puede detectar fácilmente el error.

  • throw para reportar errores
  • catch para manejar errores
  • Desacopla detección y manejo

Seguridad ante Excepciones. La biblioteca estándar ofrece garantías sobre el estado de los objetos cuando se lanzan excepciones. La garantía básica asegura que se mantienen invariantes y no hay fugas de recursos. La garantía fuerte asegura que las operaciones o bien tienen éxito o no tienen efecto.

  • Garantía básica (sin fugas, estado válido)
  • Garantía fuerte (todo o nada)
  • Especificador noexcept

Integración con RAII. El manejo de excepciones está estrechamente integrado con RAII (Adquisición de Recursos es Inicialización). Esto asegura que los recursos adquiridos por objetos se liberen correctamente durante el desenrollado de pila cuando una excepción se propaga, evitando fugas y simplificando el código de limpieza.

  • RAII para limpieza
  • Destructores llamados durante desenrollado de pila

Última actualización:

Want to read the full book?

Reseñas

4.10 de 5
Promedio de 4.0K calificaciones de Goodreads y Amazon.

El Lenguaje de Programación C++ es considerado ampliamente como la referencia definitiva para C++, escrito por el propio creador del lenguaje. Aunque se valora por su cobertura exhaustiva y sus valiosas perspectivas, muchos críticos señalan que no es adecuado para principiantes. El libro se describe como denso, a veces prolijo, y más útil como obra de consulta que como herramienta de aprendizaje. Los programadores experimentados aprecian su profundidad y detalles técnicos. Algunos critican su estilo de redacción y organización, mientras que otros lo consideran esencial para dominar C++. En conjunto, se percibe como un recurso fundamental para profesionales, pero desafiante para quienes se inician.

Your rating:
4.51
20 calificaciones

Sobre el autor

Bjarne Stroustrup es un científico de la computación danés, reconocido principalmente por ser el creador del lenguaje de programación C++. En 1979, mientras trabajaba en Bell Labs, desarrolló C++ con el objetivo de mejorar el lenguaje C, incorporando características que facilitaran la programación a gran escala. Stroustrup ha desempeñado un papel fundamental en la evolución de este lenguaje, siendo autor de varias ediciones de "The C++ Programming Language" y contribuyendo al estándar ISO de C++. A lo largo de su carrera, ha recibido numerosos reconocimientos, entre ellos el Premio al Emprendedor en Computación otorgado por la IEEE Computer Society. Además, ha ocupado cargos en la Universidad Texas A&M y en la Universidad de Columbia, desde donde continúa influyendo en el campo de la informática y el diseño de lenguajes de programación.

Listen
Now playing
The C++ Programming Language
0:00
-0:00
Now playing
The C++ Programming Language
0:00
-0:00
1x
Voice
Speed
Dan
Andrew
Michelle
Lauren
1.0×
+
200 words per minute
Queue
Home
Swipe
Library
Get App
Create a free account to unlock:
Recommendations: Personalized for you
Requests: Request new book summaries
Bookmarks: Save your favorite books
History: Revisit books later
Ratings: Rate books & see your ratings
200,000+ readers
Try Full Access for 7 Days
Listen, bookmark, and more
Compare Features Free Pro
📖 Read Summaries
Read unlimited summaries. Free users get 3 per month
🎧 Listen to Summaries
Listen to unlimited summaries in 40 languages
❤️ Unlimited Bookmarks
Free users are limited to 4
📜 Unlimited History
Free users are limited to 4
📥 Unlimited Downloads
Free users are limited to 1
Risk-Free Timeline
Today: Get Instant Access
Listen to full summaries of 73,530 books. That's 12,000+ hours of audio!
Day 4: Trial Reminder
We'll send you a notification that your trial is ending soon.
Day 7: Your subscription begins
You'll be charged on Aug 22,
cancel anytime before.
Consume 2.8x More Books
2.8x more books Listening Reading
Our users love us
200,000+ readers
"...I can 10x the number of books I can read..."
"...exceptionally accurate, engaging, and beautifully presented..."
"...better than any amazon review when I'm making a book-buying decision..."
Save 62%
Yearly
$119.88 $44.99/year
$3.75/mo
Monthly
$9.99/mo
Start a 7-Day Free Trial
7 days free, then $44.99/year. Cancel anytime.
Scanner
Find a barcode to scan

38% OFF
DISCOUNT FOR YOU
$79.99
$49.99/year
only $4.16 per month
Continue
2 taps to start, super easy to cancel
Settings
General
Widget
Loading...