You are not allowed to overload an operator for a built-in type (int, float, double, char, etc.). So, if your operator overload only involves built-in types, even if that operator doesn't exist yet for that type, it is illegal to do so. This is just a safe-guard built into C++ to stop people from doing crazy things like redefining existing operators and giving them different semantics (and also, for technical reasons, such as overload resolution when built-in types don't reside in any namespace).
Just use a regular function with a name. Operator overloading is just syntactic sugar, don't abuse the feature, use it only when it fits very naturally and when the semantics are either completely analog to the "normal" use of the operator or when it is idiomatic (as in the << operator for ostreams in C++).
You can only overload an operator that is defined in c++. You cant make a # operator that swaps 2 numbers for example. As for third question if a is a user defined type you can do such a thing. In fact overloading an operator does just that. Take this for example.
foo & operator=(const foo &);
foo & foo::operator=(const foo & foobar)
bar = foobar.bar;
a.bar = 5;
// now assign a to b
b = a;
// or you could write it like
// it is the same thing its just the first version is easier to read