#define's can't be changed without a recompile, or more strictly speaking, another run of the preprocessor and a recompile (these are usually represented as one step, although they don't have to be).
But if what you want to express really is a constant, compile-time is the only time it should be changed. Compared to #define's, declaring const objects has the advantage that it introduces a symbol into the symbol table, and so it's visible in the debugger. There is also the risk that your #define may silently redefine some other #define elsewhere in your code or that in an included header, which can result in some very obscure bugs.
The drawback to const objects, besides the negligible space penalty, is that const doesn't really mean constant, but rather "read-only through that symbol". That is an object declared const can't be assigned to, but that doesn't stop you from playing tricks like taking a const object's address and manipulating the contents via a pointer dereference.