8.7. Ejercicios

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.

  1. 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).

  2. 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++.

  3. 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.

  4. 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.

  5. 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.

  6. Cree un vector de caracteres constante, después intente cambiar uno de los caracteres.

  7. 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.

  8. 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.

  9. 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.

  10. 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.

  11. Elimine el comentario de la linea errónea en PointerAssignemt.cpp para ver qué mensaje de error muestra el compilador.

  12. 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?

  13. 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.

  14. 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

  15. Modifique ConstReturnValues.cpp eliminando los comentarios en las líneas erróneas una cada vez para ver qué mensajes de error muestra el compilador.

  16. Modifique ConsPointer.cpp eliminando los comentarios en las líneas erróneas para ver qué mensajes de error muestra el compilador.

  17. 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]).

  18. Modifique ConstTemporary.cpp eliminando el comentario en la línea errónea para ver el mensaje de error que muestra el compilador.

  19. Cree una clase que contenga un float constante y otro no constante. Inicialícelos usando la lista de inicialización del constructor.

  20. 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.

  21. 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.

  22. 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.

  23. 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.

  24. 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.

  25. Elimine el comentario de la línea errónea en mutable.cpp para ver el mensaje de error que muestra el compilador.

  26. Modifique Quoter.cpp haciendo que quote() sea un método constante y lastquote sea mutable.

  27. 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.

  28. 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++?