Este documento es una traducción incompleta del libro "Pensar en C++, vol 1" de Bruce Eckel. El libro introduce conceptos básicos de programación orientada a objetos en C++ como clases, herencia, polimorfismo, análisis y diseño orientado a objetos. El documento incluye un índice de contenido que enumera los diferentes capítulos y secciones que componen el libro.
17. El equipo de traducción de Pensar en C++ está formado por:
• David Villa Alises (coordinador) dvilla#gmx.net
• Míguel Ángel García miguelangel.garcia#gmail.com
• Javier Corrales García jcg#damir.iem.csic.es
• Bárbara Teruggi bwire.red#gmail.com
• Sebastián Gurin
• Gloria Barberán González globargon#gmail.com
• Fernando Perfumo Velázquez nperfumo#telefonica.net
• José María Gómez josemaria.gomez#gmail.com
• David Martínez Moreno ender#debian.org
• Cristóbal Tello ctg#tinet.org
• Jesús López Mollo (pre-Lucas)
• José María Requena López (pre-Lucas)
• Javier Fenoll Rejas (pre-Lucas)
Si quieres saber más sobre este proyecto visita http://arco.inf-cr.uclm.es/ david.villa/pensarC++.html.
17
18.
19. Prefacio
Como cualquier lenguaje humano, C++ ofrece maneras de expresar concep-
tos. Si se utiliza de forma correcta, este medio de expresión será significativa-
mente más sencillo y más flexible que otras alternativas cuando los problemas
crezcan en tamaño y complejidad.
No se puede ver C++ sólo como una colección de características, ya que algunas de estas caracterís-
ticas no tienen sentido por separado. Sólo se puede utilizar la suma de las partes si se está pensando
en el diseño, no sólo en el código. Y para entender C++ de esta forma, se deben comprender los prob-
lemas existentes con el lenguaje C y con la programación en general. Este libro trata los problemas de
programación, porque son problemas, y la aproximación que en C++ se ha elegido para solucionarlos.
Además, el conjunto de características que explico en cada capítulo se basará en la forma en que yo veo
un tipo de problema en particular y cómo resolverlo con el lenguaje. De esta forma espero llevar al
lector, poco a poco, del punto de entender C hasta un momento en el que pensar en C++ se convierta en
su propia lengua.
Durante todo el libro, tomaré la actitud de que el lector desea construir en su cabeza un modelo que
le permita comprender el lenguaje bajando hasta sus raíces; si se tropieza con un rompecabezas, será
capaz de compararlo con el modelo en su cabeza y deducir la respuesta. Trataré de comunicarle las
percepciones que han reorientado mi cerebro para «Pensar en C++».
Material nuevo en la segunda edición
Este libro es una minuciosa reescritura de la primera edición para reflejar todos los cambios intro-
ducidos en C++ tras la finalización del estándar que lo rige, y también para reflejar lo que he aprendido
desde la escritura de la primera edición. He examinado y reescrito el texto completo presente en la
primera edición, en ocasiones quitando viejos ejemplos, a veces cambiando los existentes, y también
añadiendo muchos ejercicios nuevos. La significativa reorganización y reordenación del material tuvo
lugar para reflejar la disponibilidad de mejores herramientas, así como mi mejor comprensión de cómo
aprende C++ la gente. He añadido un nuevo capítulo, como introducción al resto del libro, que es una in-
troducción rápida a los conceptos de C y a las características básicas de C++ para aquellos que no tienen
experiencia en C. El CD-ROM incluido al final del libro en la edición en papel contiene un seminario
que es una introducción aún más ligera a los conceptos de C necesarios para comprender C++ (o Java).
Chuck Allison lo escribió para mi empresa (MindView, Inc.), y se denomina «Pensar en C: conceptos
básicos de Java y C++». Le presentará los aspectos de C que necesita conocer para que pueda cambiarse
a C++ o Java, abandonando los desagradables bits de bajo nivel con los que los programadores de C
tratan a diario pero que lenguajes como C++ y Java mantienen lejos (o incluso eliminan, en el caso de
Java).
Así que la respuesta corta a la pregunta «¿Qué es diferente en la segunda edición?» sería que aquello
que no es completamente nuevo se ha reescrito, a veces hasta el punto en el que no podría reconocer los
ejemplos y el material originales de la primera edición.
¿Qué contiene el volumen 2 de este libro?
Con la finalización del estándar de C++, también se han añadido algunas importantes bibliotecas
nuevas, como las string y los contenedores, y algoritmos de la Librería Estándar C++, y también se ha
19
20. Índice de tablas
añadido complejidad a las plantillas. Éstos y otros temas más avanzados se han relegado al volumen 2
de este libro, incluyendo temas tales como la herencia múltiple, el manejo de excepciones, patrones de
diseño, y material sobre la creación y depuración de sistemas estables.
Cómo obtener el volumen 2
De la misma manera que el libro que lee en estos momentos, Pensar en C++, Volumen 2 se puede
descargar desde mi sitio web www.BruceEckel.com. Puede encontrar información en el sitio web sobre
la fecha prevista para la impresión del Volumen 2.
El sitio web también contiene el código fuente para ambos libros, junto con actualizaciones e infor-
mación sobre otros seminarios en CD-ROM que ofrece MidView Inc., seminarios públicos y formación
interna, consultas, soporte y asistentes paso a paso.
Requisitos
Para simplificar, en la primera edición de este libro decidí suponer que otra persona le había en-
señado C previamente y que el lector tenía, al menos, un nivel de lectura aceptable del mismo. Mi
primera intención fue hablar de lo que me resultó difícil: el lenguaje C++. En esta edición he añadido un
capítulo como introducción rápida a C, acompañada del «seminario en CD» de Thinking in C, pero aún
así asumo que el lector tiene algún tipo de experiencia en programación. Además, del mismo modo que
se aprenden muchas palabras nuevas intuitivamente, viéndolas en el contexto de una novela, es posible
aprender mucho sobre C por el contexto en el que se utiliza en el resto del libro.
Aprender C++
Yo me adentré en C++ exactamente desde la misma posición en la que espero que se encuentren
muchos de los lectores de este libro: como un programador con una actitud muy sensata y con muchos
vicios de programación. Peor aún, por mis circunstancias, mi experiencia pertenecía a la programación
empotrada a nivel hardware, en la que a veces se considera a C como un «lenguaje de alto nivel» y exce-
sivamente ineficiente para ahorrar bits. Descubrí más tarde que nunca había sido un buen programador
en C, camuflando así mi ignorancia sobre estructuras, malloc() y free(), setjmp() y longimp(),
y otros conceptos «sofisticados», y muriéndome de vergüenza cuando estos términos entraban en una
conversación, en lugar de investigar su utilidad.
Cuando comencé mi lucha por aprender C++, el único libro decente era la auto-proclamada guía
de expertos de Bjarne Stroustrup 1 así que simplifiqué los conceptos básicos por mí mismo. Esto se
acabó convirtiendo en mi primer libro de C++, 2 que es esencialmente un reflejo de mi experiencia. Fue
descrito como una guía de lectura para atraer a los programadores a C y C++ al mismo tiempo. Ambas
ediciones 3 del libro consiguieron una respuesta entusiasta.
Más o menos al mismo tiempo que aparecía Using C++, comencé a enseñar el lenguaje con semi-
narios y presentaciones. Enseñar C++ (y más tarde, Java) se convirtió en mi profesión; llevo viendo
cabezas asintiendo, caras pálidas, y expresiones de perplejidad en audiencias por todo el mundo desde
1989. Cuando comencé a dar formación interna a grupos más pequeños, descubrí algo durante los ejer-
cicios. Incluso aquella gente que estaba sonriendo y asintiendo se encontraba equivocada en muchos
aspectos. Creando y dirigiendo las pruebas de C++ y Java durante muchos años en el departamento
de conferencias para desarrollo de software, descubrí que tanto otros oradores como yo tendíamos a
tocar demasiados temas, y todo demasiado rápido. Así que, de vez en cuando, a pesar de la variedad
del nivel de la audiencia e independientemente de la forma en que presentara el material, terminaría
perdiendo alguna parte de mi público. Quizá sea pedir demasiado, pero como soy una de esas personas
que se resisten a una conferencia tradicional (y para la mayoría de las personas, creo, esta resistencia
1 Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley, 1986 (first edition).
2 Using C++, Osborne/McGraw-Hill 1989.
3 Using C++ and C++ Inside & Out, Osborne/McGraw-Hill 1993.
20
21. Índice de tablas
está causada por el aburrimiento), quise intentar mantener a cada uno a su velocidad.
Durante un tiempo, estuve haciendo presentaciones en orden secuencial. A pesar de esto, terminé
por aprender experimentando y repitiendo todo una y otra vez (una técnica que también funciona bien
en el diseño de programas en C++). Al final, desarrollé un curso usando todo lo que había aprendido
de mi experiencia en la enseñanza. Así, el aprendizaje se efectúa en pequeños pasos, fáciles de di-
gerir, y de cara a un seminario práctico (la situación ideal para el aprendizaje) hay ejercicios al final de
cada presentación. Puede encontrar mis seminarios públicos en www.BruceEckel.com, y también puede
aprender de los seminarios que he pasado a CD-ROM.
La primera edición de este libro se gestó a lo largo de dos años, y el material de este libro se ha usado
de muchas formas y en muchos seminarios diferentes. La reacción que he obtenido de cada seminario
me ha ayudado a cambiar y reorientar el material hasta que he sentido que funciona bien como un medio
de enseñanza. Pero no es sólo un manual para dar seminarios; he tratado de recopilar tanta información
como he podido en estas páginas, y estructurarlas para atraerle hasta la siguiente materia. Más que
nada, el libro está diseñado para servir al lector solitario que lucha con un lenguaje de programación
nuevo.
Objetivos
Mis objetivos en este libro son:
1. Presentar el material paso a paso, de manera que el lector pueda digerir cada concepto fácilmente
antes de continuar.
2. Usar ejemplos tan simples y cortos como sea posible. Esto a veces me impide manejar problemas
del "mundo real", pero he descubierto que los principiantes normalmente quedan más contentos
cuando pueden comprender cada detalle de un ejemplo que siendo impresionados por el ámbito
del problema que soluciona. Además, hay un severo límite en la cantidad de código que puede ser
absorbido en una clase. Por ello a veces recibo críticas por usar "ejemplos de juguete", pero tengo
la buena voluntad de aceptarlas a favor de producir algo pedagógicamente útil.
3. La cuidadosa presentación secuencial de capacidades para que no se vea algo que no ha sido expli-
cado. De acuerdo, esto no siempre es posible; en esos casos, se dará una descripción introductoria
breve.
4. Ofrecerle lo que pienso que es importante para que se comprenda el lenguaje, más que todo lo
que sé. Creo que hay una "herencia de la importancia de la información", y hay algunos hechos
que el 95 por ciento de los programadores nunca necesitará saber y que sólo podría confundirles y
añadirse a su percepción de la complejidad del lenguaje. Tomando un ejemplo de C, si memoriza
la tabla de precedencia de los operadores (yo nunca lo hice), puede escribir código más corto. Pero
si lo piensa, esto confundirá al lector/actualizador de ese código. Así que olvide la precedencia,
y utilice paréntesis cuando las cosas no estén claras. Esta misma actitud se tomará con alguna
información del lenguaje C++, la cual creo que es más importante para escritores de compiladores
que para programadores.
5. Mantener cada sección suficientemente enfocada como para que el tiempo de lectura -y el tiempo
entre los ejercicios- sea razonable. Esto no sólo mantiene las mentes de la audiencia más activas e
involucradas durante un seminario práctico, sino que también ofrece al lector un mayor sentido
de realización.
6. Dar a los lectores una base sólida de manera que puedan comprender las cuestiones lo suficiente-
mente bien como para cambiar a otros cursos y libros más difíciles (en particular, el Volumen 2 de
este libro).
7. He tratado de no utilizar ninguna versión de C++ de ningúna compañía en particular porque,
para aprender el lenguaje, no creo que los detalles de una implementación en particular sean tan
importantes como el lenguaje mismo. La mayoría de la documentación de las compañías sobre su
propia expecificación es adecuada.
21
22. Índice de tablas
Capítulos
C++ es un lenguaje en el que se construyen características nuevas y diferentes sobre una sintaxis
existente (por esta razón, nos referiremos a él como un lenguaje de programación orientado a objetos
híbrido). Como mucha gente sigue una curva de aprendizaje, hemos comenzado a apegarnos por la
forma en que los programadores atraviesan las etapas de las características del lenguaje C++. Como
parece ser la progresión natural de una mente entrenada modularmente, he decidido comprender y
seguir el mismo camino y acelerar el proceso proponiendo y resolviendo las preguntas que se me ocur-
rieron cuando yo aprendía el lenguaje y también las que se me ocurrieron en las audiencias en las que
yo enseñaba dicho lenguaje.
El curso fue diseñado con algo en mente: racionalizar el proceso de aprender C++. La reacción de
la audiencia me ayudó a comprender qué partes eran difíciles y necesitaban una iluminación extra. En
las áreas en las que me volvía ambicioso e incluía demasiadas características de una vez, me di cuenta
-mediante el proceso de la entrega de material- de que si incluyes demasiadas características, tendrás
que explicarlas todas, y la confusión de los estudiantes se verá fácilmente agravada. Como resultado, he
tenido muchos problemas para introducir las características tan lentamente como ha sido posible; sólo
un concepto importante a la vez por capítulo.
Entones, el objetivo en cada capítulo es enseñar un concepto simple, o un pequeño grupo de con-
ceptos asociados, en caso de que no haya más conceptos adicionales. De esa forma puede digerir cada
parte en el contexto de su conocimiento actual antes de continuar. Para llevar esto a cabo, dejé algunas
partes de C en algún lugar más adelante del que me hubiese gustado. El beneficio es que no se confunda
por ver usadas todas las características de C++ antes de que éstas sean explicadas, así su introducción
al lenguaje será tranquila y reflejará la forma en que asimile las características que dejo en sus manos.
He aquí una breve descripción de los capítulos que contiene este libro:
Cuando los proyectos se vuelven demasiado grandes y difíciles de mantener, nace la ‘crisis de soft-
ware’, que es cuando los programadores dicen: ‘¡No podemos terminar los proyectos, y cuando pode-
mos, son demasiado caros!’. Esto provoca gran cantidad de respuestas, que se discuten en este capítulo
mediante las ideas de programación orientada a objetos (POO) y cómo afecta ésta a resolver la crisis
de software. El capítulo le hará pasar por las características y conceptos básicos de la POO y también
introduce el análisis y diseño de procesos. Además, aprenderá los beneficios y problemas de adaptar el
lenguaje, y obtendrá sugerencias para adentrarse en el mundo de C++.
Este capítulo explica el proceso de construir programas usando compiladores y librerías. Presenta
el primer programa C++ del libro y muestra cómo se construyen y compilan los programas. Después
se presentan algunas de las librerías de objetos básicas que están disponibles en C++ estándar. Para
cuando acabe el capítulo, dominará lo que se refiere a escribir un programa C++ utilizando las librerías
de objetos incluídas.
Este capítulo es una densa vista general de las características de C que se utilizan en C++, así como
gran número de características básicas que sólo están disponibles en C++. Además introduce la utilidad
‘make’, que es común en el desarrollo software de todo el mundo y que se utiliza para construir todos los
ejemplos de este libro (el código fuente de este libro, que está disponible en www.BruceEckel.com, con-
tiene los makefiles correspondientes a cada capítulo). El capítulo 3 supone que tiene unos conocimientos
básicos sólidos en algún lenguaje de programación procedural como Pascal, C, o incluso algún tipo de
Basic (basta con que haya escrito algo de código en ese lenguaje, especialmente funciones). Si encuentra
este capítulo demasiado difícil, debería ir primero por el seminario ‘Pensar en C’ del CD que acompaña
este libro (y también disponible en www.BruceEckel.com).
La mayor parte de las características de C++ giran entorno a la capacidad de crear nuevos tipos
de datos. Esto no sólo ofrece una mayor organización del código, sino que es el trabajo preliminar
para las capacidades de POO más poderosas. Verá cómo esta idea se facilita con el simple hecho de
poner funciones dentro de las estructuras, los detalles de cómo hacerlo, y qué tipo de código se escribe.
También aprenderá la mejor manera de organizar su código mediante archivos de cabecera y archivos
de implementación.
Se puede decidir que algunos de los datos y funciones de su estructura no estén disponibles para
el usuario del tipo nuevo haciéndolas privadas. Esto significa que se puede separar la implementación
principal de la interfaz que el programador cliente ve, y de este modo permitir que la implementación se
cambie fácilmente sin afectar al código del cliente. La palabra clave class también se introduce como
22
23. Índice de tablas
una manera más imaginativa de describir un tipo de datos nuevo, y el significado de la palabra ‘objeto’
se desmistifica (es una variable divertida).
Uno de los errores más comunes en C se debe a las variables no inicializadas. El constructor de C++
permite garantizar que las variables de su nuevo tipo de datos (‘objetos de su clase’) siempre serán ini-
cializados correctamente. Si sus objetos también requieren algún tipo de reciclado, usted puede garan-
tizar que este reciclado siempre se realizará mediante el destructor C++.
Se desea que C++ le ayude a construir proyectos grandes y complejos. Mientras que lo consigue,
puede obtener múltiples bibliotecas que utilicen el mismo nombre de funciones, y también puede de-
cidir utilizar un mismo nombre con diferentes significados en la misma biblioteca. C++ lo hace sencillo
mediante la sobrecarga de funciones, lo que le permite reutilizar el mismo nombre de función siempre
que la lista de argumentos sea diferente. Los argumentos por defecto le permiten llamar a la misma
función de diferentes maneras proporcionando, automáticamente, valores por defecto para algunos de
sus argumentos.
Este capítulo cubre las palabras reservadas const y volatile, que en C++ tienen un significado
adicional, especialmente dentro de las clases. Aprenderá lo que significa aplicar const a una definición
de punteros. El capítulo también muestra cómo varía el significado de const según se utilice dentro o
fuera de las clases y cómo crear constantes inherentes a las clases en tiempo de compilación.
Las macros del preprocesador eliminan la llamada a funciones superiores, pero el preprocesador
también elimina la valiosa comprobación de tipos de C++. Las funciones en línea le ofrecen todos los
beneficios de una macro de preprocesador además de los beneficios de una verdadera llamada a función.
Este capítulo explora minuciosamente la implementación y uso de las funciones en línea.
La elección de nombres es una actividad fundamental en la programación y, cuando un proyecto
se vuelve grande, el número de nombres puede ser arrollador. C++ le permite un gran control de los
nombres en función de su creación, visibilidad, lugar de almacenamiento y enlazado. Este capítulo
muestra cómo se controlan los nombres en C++ utilizando dos técnicas. Primero, la palabra clave st-
atic se utiliza para controlar la visibilidad y enlazado, y se explora su significado especial para clases.
Una técnica mucho más util para controlar los nombres a nivel global es la capacidad del espacio de
nombres de C++, que le permite dividir el espacio de nombres global en distintas regiones.
Los punteros de C++ trabajan como los punteros de C con el beneficio adicional de la comprobación
de tipos más fuerte de C++. C++ también proporciona un método adicional para manejar direcciones:
C++ copia la referencia de Algol y Pascal, que permite al compilador manejar la manipulación de di-
recciones mientras se utiliza la notación ordinaria. También encontrará el Constructor de Copia, que
controla la manera en que los objetos se pasan por valor hacia o desde las funciones. Finalmente, se
ilumina el puntero a miembros de C++.
Esta característica se llama algunas veces ‘azúcar sintáctico’; permite dulcificar la sintaxis de uso
de su tipo permitiendo operadores así como llamadas a funciones. En este capítulo aprenderá que la
sobrecarga de operadores sólo es un tipo de llamada a función diferente y aprenderá cómo escribir los
suyos propios, manejando el -a veces confuso- uso de los argumentos, devolviendo tipos, y la decisión
de si hacer un operador miembro o amigo.
¿Cuántos aviones necesitará manejar un sistema de tráfico aéreo? ¿Cuántas formas requerirá un
sistema CAD? En el problema de la programación genérica, no se puede saber la cantidad, tiempo de
vida o el tipo de los objetos necesitará el programa una vez lanzado. En este capítulo, aprenderá cómo
new y delete solventan elegantemente este problema en C++ creando objetos en el montón. También
verá cómo new y delete pueden sobrecargarse de variadas maneras de forma que puedan controlar
cómo se asigna y se recupera el almacenamiento.
La abstracción de datos le permite crear tipos nuevos de la nada, pero con composición y herencia,
se puede crear tipos nuevos de los ya existentes. Con la composición, se puede ensamblar un tipo nuevo
utilizando los otros tipos como piezas y, con la herencia, puede crear una versión más expecífica de un
tipo existente. En este capítulo aprenderá la sintaxis, cómo redefinir funciones y la importancia de la
construcción y destrucción para la herencia y la composición.
Por su parte, debería tomarle nueve meses descubrir y comprender esta piedra angular de la POO. A
través de ejercicios pequeños y simples, verá cómo crear una familia de tipos con herencia y manipular
objetos de esa familia mediante su clase base común. La palabra reservada virtual le permite tratar
todos los objetos de su familia de forma genérica, lo que significa que el grueso del código no depende de
23
24. Índice de tablas
información de tipo específica. Esto hace extensibles sus programas, de manera que construir programas
y mantener el código sea más sencillo y más barato.
La herencia y la composición permiten reutilizar el código objeto, pero eso no resuelve todas las
necesidades de reutilización. Las plantillas permiten reutilizar el código fuente proporcionando al com-
pilador un medio para sustituir el nombre de tipo en el cuerpo de una clase o función. Esto sostiene el
uso de bibliotecas de clase recipiente, lo que son herramientas importantes para el desarrollo rápido y
robusto de programas orientados a objetos (la Biblioteca Estándar de C++ incluye una biblioteca signi-
ficativa de clases recipiente). Este capítulo da una base minuciosa en esta materia esencial.
Temas adicionales (y materias más avanzadas) están disponibles en el Volumen 2 del libro, que se
puede descargar del sitio web www.BruceEckel.com.
Ejercicios
He descubierto que los ejercicios son excepcionalmente útiles durante un seminario para completar
la comprensión de los estudiantes, así que encontrará algunos al final de cada capítulo. El número de
ejercicios ha sido incrementado enormemente respecto a la primera edición.
Muchos de los ejercicios son suficientemente sencillos como para que puedan terminarse en una
cantidad de tiempo razonable en una clase o apartado de laboratorio mientras el instructor observa,
asegurándose de que todos los estudiantes absorben el material. Algunos ejercicios son un poco más
complejos para mantener entretenidos a los estudiantes avanzados. El grueso de los ejercicios se orienta
a ser resueltos en poco tiempo y se intenta sólo probar y educar su conocimiento más que presentar retos
importantes (seguramente los encontrará usted mismo -o más probablemente-, ellos le encontrarán a
usted).
Soluciones a los ejercicios
Las soluciones a los ejercicios seleccionados pueden encontrarse en el documento electrónico El Solu-
cionario de Pensar en C++, disponible por una pequeña cantidad en www.BruceEckel.com.
Código fuente
El código fuente de este libro está registrado como software gratuito, distribuido mediante el sitio
Web www.BruceEckel.com. El registro le impide publicar el código en un medio impreso sin permiso,
pero se le asegura el derecho de usarlo de muchas otras maneras (ver más abajo).
El código está disponible en un fichero comprimido, destinado a extraerse desde cualquier plataforma
que tenga una utilidad ‘zip’ (la mayoría lo tienen; puede buscar en Internet para encontrar una versión
para su platarforma si aún no tiene una instalada). En el directorio inicial donde desempaquete el código
encontrará la siguiente nota de registro:
Copyright (c) 2000, Bruce Eckel
Source code file from the book "Thinking in C++"
All rights reserved EXCEPT as allowed by the
following statements: You can freely use this file
for your own work (personal or commercial),
including modifications and distribution in
executable form only. Permission is granted to use
this file in classroom situations, including its
use in presentation materials, as long as the book
"Thinking in C++" is cited as the source.
Except in classroom situations, you cannot copy
and distribute this code; instead, the sole
distribution point is http://www.BruceEckel.com
(and official mirror sites) where it is
available for free. You cannot remove this
copyright and notice. You cannot distribute
24
25. Índice de tablas
modified versions of the source code in this
package. You cannot use this file in printed
media without the express permission of the
author. Bruce Eckel makes no representation about
the suitability of this software for any purpose.
It is provided "as is" without express or implied
warranty of any kind, including any implied
warranty of merchantability, fitness for a
particular purpose, or non-infringement. The entire
risk as to the quality and performance of the
software is with you. Bruce Eckel and the
publisher shall not be liable for any damages
suffered by you or any third party as a result of
using or distributing this software. In no event
will Bruce Eckel or the publisher be liable for
any lost revenue, profit, or data, or for direct,
indirect, special, consequential, incidental, or
punitive damages, however caused and regardless of
the theory of liability, arising out of the use of
or inability to use software, even if Bruce Eckel
and the publisher have been advised of the
possibility of such damages. Should the software
prove defective, you assume the cost of all
necessary servicing, repair, or correction. If you
think you’ve found an error, please submit the
correction using the form you will find at
www.BruceEckel.com. (Please use the same
form for non-code errors found in the book.)
Se puede usar el código en proyectos y clases siempre y cuando la nota de registro se mantenga.
Estándares del lenguaje
Durante todo el libro, cuando se haga referencia al estándar de C ISO, generalmente se dirá ‘C’. Sólo
si se necesita distinguir entre C estándar y otros más viejos, versiones previas al estándar de C, se hará
la distinción.
Cuando se escribió esto, el Comité de Estándares de C++ ya había terminado de trabajar en el
lenguaje. De este modo, se usará el término C++ estándar para referirse al lenguaje estandarizado.
Si se hace referencia simplemente a C++, debería asumir que se quiere decir ‘C++ estándar’.
Hay alguna confusión sobre el nombre real del Comité de Estándares de C++ y el nombre del están-
dar mismo. Steve Clamage, el presidente del comité, clarificó esto:
Hay dos comités de estandarización de C++: El comité NCITS (antiguamente X3) J16 y el comité ISO
JTC1/SC22/WG14. ANSI alquila NCITS para crear comités técnicos para desarrollar estándares nacionales amer-
icanos.
J16 fue alquilado en 1989 para crear un estándar americano para C++. Por el año 1991 se alquiló WG14 para
crear un estándar internacional. El proyecto J16 se convirtió en un proyecto ‘Tipo I’ (Internacional) y se subordinó
al esfuerzo de estandarización de ISO.
Los dos comités se encontraron al mismo tiempo en el mismo sitio, y el voto de J16 constituye el voto americano
con WG14. WG14 delega el trabajo técnico a J16. WG14 vota por el trabajo técnico de J16.
El estándar de C++ fue creado originalmente como un estándar ISO. ANSI votó más tarde (como recomendaba
J16) para adoptar el estándar de C++ ISO como el estándar americano para C++.
Así, ‘ISO’ es la forma correcta de referirse al estándar de C++.
25
26. Índice de tablas
Soporte del lenguaje
Puede que su compilador no disponga de todas las características discutidas en este libro, especial-
mente si no tiene la versión más actual del compilador. Implementar un lenguaje como C++ es una
tarea hercúlea, y puede esperar que las características aparecerán poco a poco en lugar de todas a la
vez. Pero si prueba uno de los ejemplos del libro y obtiene un montón de errores del compilador, no es
necesariamente un error en el código o el compilador; simplemente puede no estar implementado aún
en su compilador particular.
El CD-ROM del libro.
El contenido principal del CD-ROM empaquetado al final de este libro es un ‘seminario en CD-ROM’
titulado Pensar en C: Fundamentos para Java y C++ obra de Chuck Allison (publicado por MindView,
Inc., y también disponible en grandes cantidades en www.BruceEckel.com). Esto contiene muchas ho-
ras de grabaciones y transparencias, que pueden mostrarse en la mayoría de las computadoras que
disponen de lector de CD-ROM y sistema de sonido.
El objetivo de Pensar en C es llevarle cuidadosamente a través de los fundamentos del lenguaje C.
Se centra en el conocimiento que necesita para poder cambiar a los lenguajes C++ o Java en lugar de
intentar hacerle un experto en todos los recovecos de C (una de las razones de utilizar un lenguaje de
alto nivel como C++ o Java es, precisamente, que se pueden evitar muchos de esos recovecos). También
contiene ejercicios y soluciones guiadas. Téngalo en cuenta porque el Capítulo capítulo 3 de este libro
va más allá del CD de Pensar en C, el CD no es una alternativa a este capítulo, sino que debería utilizarse
como preparación para este libro.
Por favor, advierta que el CD-ROM está basado en navegador, por lo que debería tener un navegador
Web instalado en su máquina antes de utilizarlo.
CD-ROMs, seminarios, y consultas
Hay seminarios en CD-ROM planeados para cubrir el Volumen 1 y el Volumen 2 de este libro. Estos
comprenden muchas horas de grabaciones mías que acompañan las transparencias que cubren el mate-
rial seleccionado de cada capítulo del libro. Pueden verse en la mayoría de las computadoras que dispo-
nen de lector de CDROM y sistema de sonido. Estos CDs pueden comprarse en www.BruceEckel.com,
donde encontrará más información y lecturas de ejemplo.
Mi compañía, MindView, Inc., proporciona seminarios públicos de preparación práctica basados en
el material de este libro y también en temas avanzados. El material seleccionado de cada capítulo repre-
senta una lección, que se continúa con un periodo de ejercicios monitorizados para que cada estudiante
reciba atención personal. También propocionamos preparación ‘in situ’, consultoría, tutorización, dis-
eño y (FIXME:code walkthrows). Puede encontrar la información y los formularios para los próximos
seminarios, así como otra información de contacto, en www.BruceEckel.com.
A veces me encuentro disponible para consultas de diseño, evaluación de procesos y (FIXME:code
walkthrows). Cuando comencé a escribir sobre computadoras, mi motivación principal fue incrementar
mis actividades de consultoría, porque encontraba que la consultoría era competitiva, educacional, y
una de mis experiencias profesionales más valiosas. Así haré todo lo que pueda para incluirle a usted
en mi agenda, o para proporcionarle uno de mis socios (que son gente que conozco bien y con la que he
tratado, y a menudo gente que co-desarrollan e imparten seminarios conmigo).
Errores
No importa cuántos trucos emplee un escritor para detectar los errores, algunos siempre se escapan y
saltan del papel al lector atento. Si encuentra algo que crea que es un error, por favor, utilice el formulario
de correcciones que encontrará en www.BruceEckel.com. Se agradece su ayuda.
26
27. Índice de tablas
Sobre la portada.
La primera edición de este libro tenía mi cara en la portada, pero para la segunda edición yo quería
desde el principio una portada que se pareciera más una obra de arte, como la portada de Pensar en Java.
Por alguna razón, C++ parece sugerirme Art Decó con sus curvas simples y pinceladas cromadas. Tengo
en mente algo como esos carteles de barcos y aviones con cuerpos dulcemente largos.
Mi amigo Daniel Will-Harris, (www.Will-Harris.com) a quien conocí en las clases del coro del insti-
tuto, iba a llegar a ser un diseñador y escritor de talla mundial. Él ha hecho prácticamente todos mis
diseños, incluída la portada para la primera edición de este libro. Durante el proceso de diseño de la
portada, Daniel, insatisfecho con el progreso que realizábamos, siempre preguntaba: ‘¿Cómo hace esto
para relacionar a la gente con las computadoras?’. Estábamos atascados.
Como capricho, sin nada en mente, me pidió que pusiera mi cara en el escáner. Daniel tenía uno
de sus programas gráficos (Corel Xara, su favorito) que ‘autotrazó’ mi cara escaneada. Él lo describe
de la siguente manera: ‘El autotrazado es la manera de la computadora para transformar un dibujo
en los tipos de líneas y curvas que realmente le gustan’. Entonces jugó con ello hasta que obtuvo algo
que parecía como un mapa topográfico de mi cara, una imagen que podría ser la manera en que una
computadora ve a la gente.
Tomé esta imagen y la fotocopié en papel de acuarela (algunas copiadoras pueden manejar paquetes
gruesos), y entonces comenzó a realizar montones de experimentos añadiendo acuarela a la imagen.
Seleccionamos las que nos gustaban más, entonces Daniel las volvió a escanear y las organizó en la
portada, añadiendo el texto y otros elementos de diseño. El proceso total requirió varios meses, may-
ormente a causa del tiempo que me tomó hacer las acuarelas. Pero me he divertido especialmente con
ello porque conseguí participar en el arte de la portada, y porque me dio un incentivo para hacer más
acuarelas (lo que dicen sobre la práctica realmente es cierto).
Diseño del libro y producción
El diseño del interior del libro fue creado por Daniel Will-Harris, que solía jugar con letras (FIXME:rub-
on) en el instituto mientras esperaba la invención de las computadoras y los entornos de publicación.
De todos modos, yo mismo produje las páginas para impresión (camera-ready), por lo que los errores
tipográficos son míos. Se utilizó Microsoft R Word para Windows Versiones 8 y 9 para escribir el libro
y crear la versión para impresión, incluyendo la generación de la tabla de contenidos y el índice (creé
un servidor automatizado COM en Python, invocado desde las macros VBA de Word, para ayudarme
en el marcado de los índices). Python (vea www.python.com) se utilizó para crear algunas de las her-
ramientas para comprobar el código, y lo habría utilizado como herramienta de extracción de código si
lo hubiese descubierto antes.
Creé los diagramas utilizando Visio R . Gracias a Visio Corporation por crear una herramienta tan
útil.
El tipo de letra del cuerpo es Georgia y los títulos utilizan Verdana. La versión definitiva se creó con
Adobe R Acrobat 4 y el fichero generado se llevó directamente a la imprenta - muchas gracias a Adobe
por crear una herramienta que permite enviar documentos listos para impresión por correo electrónico,
así como permitir que se realicen múltiples revisiones en un único día en lugar de recaer sobre mi
impresora láser y servicios rápidos 24 horas (probamos el proceso Acrobat por primera vez con Pensar
en Java, y fui capaz de subir la versión final de ese libro a la imprenta de U.S. desde Sur África).
La versión HTML se creó exportando el documento Word a RTF, y utilizando entonces RTF2HTML
(ver http://www.sunpack.com/RTF/ ) para hacer la mayor parte del trabajo de la conversión HTML
(gracias a Chris Hector por hacer una herramienta tan util y especialmente fiable). Los ficheros resul-
tantes se limpiaron utilizando un programa Python que truqué, y los WMFs se transformaron en GIFs
utilizando el PaintShop Pro 6 de JASC R y su herramienta de conversión por lotes (gracias a JASC por
resolver tantos de mis problemas con su excelente producto). El realce del color de la sintaxis se añadió
con un script Perl amablemente cedido por Zafir Anjum.
27