First thing: there's two errors: p_ is not declared, and the return in operator* should be return *p_.
Anyway, the explicit is so the constructor can't be called implicitly.
Consider this:
class Example {
public:
    int x;
    Example(int x) : x(x) {}
};
function ex(const Example& e) {
    std::cout << e.x;
}
int main() {
    ex(5);
    return 0;
}
Do you expect this to compile? It does.  And it outputs 5. The reason is that an Example is implicitly constructed.  Basically the ex(5) is silently turned into ex(Example(5)).  Marking a constructor as explicit forbids this behavior.  If you added an explicit to the constructor, this would be a compile time error.
As for the operator overloading, what you have here is a basic 'smart' pointer.  (I would probably use one of the standard ones in C++11 or boost if you can't use a compiler that has the standardized ones by the way.)
Operator overloading allows an object to react to objects in a specific way.  In this situation, operator overloading is allowing the class to pretend to be a pointer over the same type that it's containing.
RAII<std::vector<int>> r(new std::vector<int>());
std::cout<<r‐>size()<<std::endl;
r is pretending to be a std::vector<int>* via operator overloading here.  What is really happening is that it's being called as:
(r.operator->())->size()
operator-> returns a std::vector<int>*, so the second -> is accessing that and calling the size() method.
Another example of operator overloading that you're probably familiar with is std::vector's operator[].  operator[] returns a reference to an element.
Operator overloading is of course not always used to pretend to be doing already built in things. Consider ostream's operator<<.  Rather than the bitshift operator, it puts data into a stream.
More information: standard smart pointers / boost smart pointers / RAII / operator overloading.
Oh, and your code violates the very commonly adhered to rule-of-three (or rule of five in C++11).  As it is, your class will double delete a pointer if a copy is made.
RAII<int> p(new int)
RAII<int> q = p;
//when q's destructor runs, bad bad things will happen since p's destructor already deleted the int.