Собственные операторы в C++ создавать нельзя, а можно только перегружать существующие (не все, но многие). Такое ограничение вызвано прежде всего тем, что синтаксический анализатор языка с созданием каждого нового оператора пришлось бы тоже учить как-то его распознавать (проверять корректность использования и т.д.).
Перечень операторов доступных для перегрузки:
+ — * / % ^ & |
~ ! , >= <= > < =
++ — << >> == != && ||
+= -= /= %= ^= &= |= *=
<<= >>= [ ] ( ) -> ->* new delete
Даже среди существующих операторов есть такие, которые нельзя перегрузить. Например, оператор разрешения области видимости :: или оператор ., используемый для обращения к полям и методам объекта.
Перегрузка операторов не всегда является процедурой необходимой. Во многих современных языках такой возможности нет (например, в Java).
Во-первых, перегружая оператор можно наделить его не очевидным смыслом для всех прочих разработчиков, кроме автора программы. Например, логичным является перегрузка оператора + для класса строк (он может использоваться для склейки / объединения / конкатенации двух и более строк), но какой результат должен давать, например, оператор * примененный к двум строкам?
Во-вторых, перегрузка оператора в контексте конкретной задачи (конкретного класса) может получиться неоднозначной. Например, если для класса векторов мы перегружаем оператор *, то результатом должно быть векторное или скалярное произведение?