Every generation must learn this for themselves though.
We who? From where I stand people are fine with operator overloading where it makes sense and C++ is far from being the only language with this feature.
Problem comes when shitty programmers get orgasmic about some language feature and try to use it everywhere to everyone's detriment.
Gross exaggeration. Just a bit of plain common sense. Do override operators to perform matrix ops. Do not override + operator to do multiplication instead. And do not subtract apples from cars.
As for your further example as I said give shitty programmer code in any language and they will manage to fuck it up.
These were the major pain points for the Java lawsuit that Sun did against Microsoft.
The irony with all these attempts to make COM easier to use is that they always fail flat when the Windows dev team has their turn, and then they undo everything and we are back into C++ and IDL land (latest version of it, C++/WinRT).
* `operator=` and `operator ,`
* `operator new` and `operator delete`
* `operator +=` overloaded differently from `operator +`
* `operator &&` and `operator ||` overloading works differently in C#, so that it preserves the short-circuiting behavior
* `operator ++` only can be overloaded once in C#, with the compiler automatically handling the difference between pre- and post-increment
But more crucially, the C# standard library uses operator overloading only for types like `decimal` and `BigInteger`. C# programmers can go years without ever overloading an operator, while still profiting from it whenever they use `BigInteger`.
It's very different from the C++ culture where * everyone needs to learn about how to overload `operator=` (for memory management)
* the standard library encourage abuses of operator overloading such as shift operators for iostreams
It should be unsurprising novice programmers abuse operator overloading when the C++ language teaches them exactly that.The language kind of put itself into a corner when what C# calls `MoveNext` is called `++` (with two variants of course) and what C# calls `Current` is called `*`. Taking what mathematically worked for iterating an array and taking it piecemeal to define your syntax is the kind of operator overloading that is a bad idea.