Las soluciones a los ejercicios se pueden encontrar en el documento electrónico titulado «The Thinking in C++ Annotated Solution Guide», disponible por poco dinero en www.BruceEckel.com.
Cree 3 valores enteros constantes, después súmelos todos para producir un valor que determine el tamaño en la definición de un vector. Intente compilar el mismo código en C y vea qué sucede (generalmente se puede forzar al compilador de C++ para que funcione como un compilador de C utilizando alguna opción de linea de comandos).
Probar que los compiladores de C y C++ realmente tratan las constantes de modo diferente. Cree una constante global y úsela en una expresión global constante, compile dicho código en C y C++.
Cree definiciones constantes para todos los tipos del lenguaje y sus variantes. Úselos en expresiones con otras constantes para hacer definiciones de constantes nuevas. Compruebe que compilan correctamente.
Cree una definición de constante en un archivo de cabecera,
incluya dicho archivo en dos archivos
.cpp
, compílelos y enlácelos con el
compilador de C++. No deberían ocurrir errores. Ahora
intente el mismo experimento con el compilador de C.
Cree una constante cuyo valor se determine en tiempo de
ejecución leyendo la hora en que comienza la ejecución del
programa (puede usar <ctime>
). Después, en el
programa, intente leer un segundo valor de hora,
almacenarlo en la constante y vea qué sucede.
Cree un vector de caracteres constante, después intente cambiar uno de los caracteres.
Cree una declaración de constante extern
en un
fichero y ponga un main()
en el que se
imprima el valor de dicha constante. Cree una definición de
constante extern
en un segundo fichero, compile y
enlace los dos ficheros.
Defina dos punteros a const long
utilizando
las dos formas de definición. Apunte con uno de ellos a
un vector de long
. Demuestre que se puede
incrementar o decrementar el puntero, pero no se puede
cambiar el valor de lo que apunta.
Defina un puntero constante a double
, y apunte
con él a un vector de double
. Demuestre que se
puede cambiar lo que apunta el puntero pero no se puede
incrementar ni decrementar el puntero.
Defina un puntero constante a objeto constante. Pruebe que solamente se puede leer el valor de lo que apunta el puntero, pero no se puede cambiar el puntero ni lo que apunta.
Elimine el comentario de la linea errónea en
PointerAssignemt.cpp
para ver qué
mensaje de error muestra el compilador.
Cree un literal de cadena y un puntero que apunte al comienzo del literal. Ahora, use el puntero para modificar los elementos del vector, ¿Informa el compilador de algún error? ¿Debería? Si no lo hace, ¿Porqué piensa que puede ser?
Cree una función que tome un argumento por valor como constante, después intente cambiar el argumento en el cuerpo de la función.
Cree una función que tome un float
por
valor. Dentro de la función vincule el argumento a un
const float&
y use dicha referencia para
asegurar que el argumento no sea modificado
Modifique ConstReturnValues.cpp
eliminando los comentarios en las líneas erróneas una cada
vez para ver qué mensajes de error muestra el compilador.
Modifique ConsPointer.cpp
eliminando
los comentarios en las líneas erróneas para ver qué mensajes
de error muestra el compilador.
Haga una nueva versión de
ConstPointer.cpp
llamada
ConstReference.cpp
que demuestre el
funcionamiento con referencias en lugar de con punteros.
(quizá necesite consultar el [FIXME:capítulo 11]).
Modifique ConstTemporary.cpp
eliminando el comentario en la línea errónea para ver el
mensaje de error que muestra el compilador.
Cree una clase que contenga un float
constante
y otro no constante. Inicialícelos usando la lista de
inicialización del constructor.
Cree una clase llamada MyString
que contenga una cadena y tenga un constructor que
inicialice la cadena y un método
print()
. Modifique
StringStack.cpp
para que maneje
objetos MyString
y
main()
para que los imprima.
Cree una clase que contenga un atributo constante que se inicialice en la lista de inicialización del constructor y una enumeración no etiquetada que se use para determinar el tamaño de un vector.
Elimine el especificador const
en la definición del
método de ConstMember.cpp
, pero deje
el de la declaración para ver qué mensaje de error muestra
el compilador.
Cree una clase con un método constante y otro ordinario. Cree un objeto constante y otro no constante de esa clase e intente invocar ambos métodos desde ambos objetos.
Cree una clase con un método constante y otro ordinario. Intente llamar al método ordinario desde el método constante para ver qué mensaje de error muestra el compilador.
Elimine el comentario de la línea errónea en
mutable.cpp
para ver el mensaje de
error que muestra el compilador.
Modifique Quoter.cpp
haciendo que
quote()
sea un método constante y
lastquote
sea mutable
.
Cree una clase con un atributo volatile
. Cree
métodos volatile
y no volatile
que
modifiquen el atributo volatile
y vea qué dice el
compilador. Cree objetos volatile
y no
volatile
de esa clase e intente llamar a ambos
métodos para comprobar si funciona correctamente y ver qué
mensajes de error muestra el compilador en caso contrario.
Cree una clase llamada bird
que
pueda ejecutar fly()
y una clase
rock
que no pueda. Crear un objeto
rock
, tome su dirección y asigne a un
void*
. Ahora tome el void*
,
asígnelo a un bird*
(debe usar un molde) y
llame a fly()
a través de dicho
puntero. ¿Esto es posible porque la característica de C que
permite asignar a un void*
(sin un molde) es
un agujero del lenguaje, que no debería propagarse a C++?