the reality is if you are given code to work with and you see i = j * 5, if it's C you know what it does; if it's C++, you don't, regardless of who wrote it.
Nonsense. The only way you don't know what that means in C++ is if the code was written by a complete, drooling idiot.
Seriously, this is the first thing C programmers pull out to criticize C++... but in 23 years of professional C++ programming, I have never seen bizarre arithmetic operator overloading used in practice, except for iostreams, and you get used to that pretty quickly, given that it's been part of the standard library since very early on.
I have a few times seen libraries of mathematical operations, say on vectors or tensors, that made heavy use of arithmetic operator overloading, but it was so they could say "i = j * 5" where i and j are n-dimensional matrices. In those cases, operator overloading not only makes sense, it's a dramatic improvement over C.
If you want to criticize C++, there are lots of valid criticisms, mostly around the huge variety of features and the complexity of their interactions, which can get really subtle. And you can criticize many of the insane template metaprogramming constructs (though those can be really useful sometimes, particularly in building up infrastructure that allow the compiler to diagnose all sorts of errors you might make). If you don't like "invisible" stuff, you can criticize the abuses that can be made of constructors and destructors. But operator overloading? Faugh.