Also in the "hiding stuff behind the scenes" department C++ is quite bad.
SomeClass someMethod(SomeClass a, SomeClass b) {
...
}
is doing a lot behind the scenes. Code below is better but it's longer and less convenient to write. const SomeClass& someMethod(const SomeClass& a, const SomeClass& b) {
...
}
And actually C++ code isn't easy to reason about wihtout reading the whole program. It isn't even easy to parse.What's going to happen when you run this?
y = f(x);
It may be that f is function, or a type. f may return the correct type to assign to y, or it may return something else and automatically run some conversion. There may be copy constructor and some destructors involved if it's returning object and not reference. It may run overloaded operator= and do anything at all, for example add f(x) to y. Hell, f can also be a class with operator() overloaded, and you would need to track its state to see what will happen.And we haven't even touched the subject of #define.
It's much easier to reason about Java code for example.