Operator overload allows you to define a mathematical operator to operate on types other than numeric.
For example you might have a string class and you want the '+' operator to concatenate strings, this allows you to write a line such as this -
string myString = "Hello" + "world
You can also use this with classes, you might have an iage class, or just an extension of the existing Image class, and want to add an overload so that you can add images into a gif animation
myImage = picture1 + picture2
Obviously you have to write the operator's function, but in your your code that uses this operator it is much easier to see what you are doing.
Function overloads -
private void Print(string printThis)
private void Print(int printThis)
Now you can use the print and the one of the type you are passing is used,
Print(20)
Print("Hello")
You no longer need a new function name for each variation of your own print function, but the type list can not be the same. You can not overload using -
private void Print(string printThis)
private void Print(string printSomethingElse)
Because the compiler needs the difference in types to mangle the names, name mangling is really just a way for the compiler to create individual names for each function that you have overloaded.