Ну например, для всяких алгебраических типов данных перегрузка операторов однозначно полезна. Вместо какого-нибудь:
Код
c = sqrt(complex_add(complex_mul(a, a), complex_mul(b, b)));
можно записать:
Код
c = sqrt(a * a + b * b);
Существенно улучшает читаемость кода и уменьшает вероятность ошибок. Перегружать операторы конечно надо так, чтоб их семантика была очевидна.
Плохой пример:
Код
MyArray<int> array;
...
array = 10;
Если оператор присваивания перегружен. Что он может делать с массивом? Делает размер массива равным 10? Или присваивает всем элементам массива значение 10? Или только первому элементу?