«#define» es una directiva de preprocesador. Define una etiqueta y un valor, que se colocarán en el código fuente preprocesado en el mismo lugar de cada aparición de la etiqueta. No se define ningún tipo, por lo que es una sustitución básica y tonta de cadenas antes de la compilación. Entonces puede dar lugar a errores o malentendidos durante la compilación.
«const int xxx» define un tipo y bloquea el valor de esa instancia. Es más seguro usar este método. El compilador puede buscar errores de tipo y lanzar mensajes (o interrumpir la compilación) si cometió un error.
Ejemplo:
#define A 5 int dummy_integer = A
… será preprocesado como …
int dummy_integer = 5
… y el compilador leerá esta declaración.
Sin embargo, si mal no recuerdo, siempre puede sobrescribir una directiva de preprocesador de la siguiente manera:
#define A 5 int dummy_integer = A //some code here #undef A #define A "my_string" std::cout << A
Eso no es bueno. Al usar el modificador «const», en cambio, no puede «cambiar el valor (ni el tipo) de una variable (y por lo tanto, se define como» constante «).