register used as a hint to the compiler that a variable should be stored in a register instead of on the stack. Compilers will frequently ignore this and do whatever they want; variables will be allocated into registers if at all possible anyway.
volatile indicates memory may change without the program actually doing anything. This is another hint to the compiler that it should avoid optimizing accesses to that location. For instance, if you have two consecutive writes to the same location with no intervening reads, the compiler might optimize away the first one. However, if the location you're writing to is a hardware register, you would need every write to go through, exactly as written. So volatile is like saying "just trust me on this".
extern indicates a definition occurs outside of the current file. Useful for global variables, but usually implied in a declaration anyway. As Blindy notes, it's also useful for indicating a function should have C linkage. A function with C linkage will get compiled using its actual name as its symbol in the output executable. C++ functions include more information, like the types of their arguments in their symbols. This is why overloading works in C++ but not in C.
explicit applies to C++ constructors. It means that the constructor should not be called implicitly. For example, say you have an Array class with a constructor that accepts an integer capacity. You don't want integer values being implicitly converted into Array objects just because there's an integer constructor.