Для чего нужна перегрузка операторов?
После определения своих классов часто требуются разные операции над их экземплярами, и перегрузка операторов помогает представить это в удобочитаемом виде.
Например, экземпляры класса Vector3 нужно сложить (обычная операция сложения векторов в 3х мерном пространстве), и в случае без перегрузки операторов это имело следующий видfirstVector.add(secondVector); // отсюда понятно, что к первому вектору прибавляется второй, но скорее всего результат записывается в первый
А если статическую функцию использовать:Vector3::sum(firstVector,secondVector); // тогда ясно что возвращается их сумма, но все равно с виду не хорошо выглядит
А вот с перегруженным оператором + можно получить следующееfirstVector+secondVector; // и это будет работать так же, как пример выше,  но с значительно улучшенным видом
И так можно делать как с многими операторами, не только арифметическими или логическими
она нужна, что бы упростить разработку. Когда вы разрабатываете свой класс и вам нужно сделать сортировку по какому то из полей, например, вы можете сравнивать напрямую это поле, или написать перегрузку операторов и сравнивать сразу экземпляры, так же есть операторы присваивания, которые, позволяют скопировать не только указатель на данные, но и отдельно сами данные. Все что делается в этих операторах, можно сделать руками, но сделав перегрузку вы делаете удобнее прежде всего себе и уменьшаете дублирование кода, а значит поправив код в одном месте вы его поправите везде