Actually, when you declare a constant outside of a class, it should be pretty much unchangable. You can't pass around pointers or references to it unless they're pointers or references to constants... which means the compiler won't let you change anything through them. You can do a const_cast on them to get the program to compile, but that'll still probably cause your program to crash at run-time.
Your logic about #defines being faster because they affect the actual program text is correct in theory. In actuality, however, because of the above fact (constants really are constant), the compiler, if it's worth anything, will perform an optimization to make accessing the constant exactly as fast as it would be with a #define.
Since there's really no difference in speed between the two options, it's usually a better idea to not use #defines if you can help it. Since all they do is change text, they don't know anything about type-safety. They pollute the global namespace. They can cause subtle changes to other parts of your program that are really hard to detect. In short, they're dangerous. Constants respect type and namespaces. Use them in place of #defines if at all possible. When you must use #defines, give them really long, messy, all-caps names like STATIC_ASSERTION_MACRO so they don't conflist with other parts of your program.