Операторы должны быть перегружены, только если вы не изменяете значение этих операторов. *
Это означает, например, если нет математического определения произведениядва объекта, не перегружайте оператор умножения для этих объектов.Если имелось математическое соответствие, перегрузка операторов может сделать класс более удобным для использования, позволяя уравнениям выражаться в форме a * b + c, а не в более многословном (a.multiply (b)). Add (c) Гдеиспользуются операторы сложения и умножения, намерение - сложение и умножение.Любое другое значение более чем вероятно может смутить других.Некоторые другие типы, где допустима перегрузка операторов (и, на мой взгляд, предпочтительнее ), являются интеллектуальными указателями, итераторами, комплексными числами, векторами и бигнумами.
Это следует из одной схемыЦели C ++ заключаются в том, чтобы иметь возможность определять классы, которые так же просты в использовании, как и встроенные типы.Конечно, есть операторы, которые вы можете определить для классов, которые также не являются математическими понятиямиВы можете захотеть перегрузить операторы == и! = Вместо написания метода isEqual и, возможно, захотите перегрузить =, потому что оператор присваивания по умолчанию компилятора не тот, который вам нужен.
С другой стороны, перегрузка оператораОператор, делающий что-то неожиданное, например определение ^ для перевода строки на японский, неясен и опасен.Ваши коллеги-программисты не будут рады узнать, что то, что выглядело как эксклюзив или сравнение, на самом деле было совсем другим.Тогда решение состоит в том, чтобы написать свои классы, чтобы упростить написание clear и обслуживаемого кода, независимо от того, означает ли это перегрузку операторов или ее избежание.
Добавление двух векторовслишком двусмысленно, чтобы не определить оператора.Как показали другие, многие люди имеют разные представления о том, что это значит, в то время как для строки все понимают, что сложение двух строк означает конкатенацию.В вашем примере не совсем ясно, хотите ли вы добавить компонент для всех элементов, добавить элемент в конец или объединить два вектора вместе.Хотя это может быть более кратким, сделать это таким образом, использование перегрузки операторов для создания собственного языка программирования - не лучший способ.
* Да, я знаю, что Stroustrup перегружен << и >> делатьпотоковые операции, а не битовые сдвиги.Но они не часто использовались по сравнению с арифметическими и указательными операторами, во-первых, и можно утверждать, что теперь, когда все знают, как использовать cout, обычно понимают, что << и >> являются операторами вставки и извлечения.(Первоначально он пытался использовать только <и> для ввода и вывода, но значение этих операторов было настолько укоренилось в умах, что код стал нечитаемым.)