In order:
1) Yep 95% of the time, the thing to do is return a reference. It is not obligatory, for example you could return a flag (for example on a cyclic counter as it loops over)
2)
loc& operator++(); // prefix
loc& operator++(int); // postfix
Note that you do nothing with the int e.g. you write
loc&
loc::operator++(int)
{
// stuff
return *this;
}
3) I very very much doubt you want a friend function. If they are the same class then you have automatic access anyway. I will also say that version 3 is very strange. The code as given will not work. operator++ MUST take nothing or an int.
If you want a bit more help with (3), then a little more pseudo code explaining what you are actually trying to achieve would help a lot I think.
Hope this helps.