int a = 2 * (3 +1);can equally be written
int helper = 3 +1; int a = 2 * helper;. However, this breaks with
obj.meth (). When you try instead to say
helper = obj.meth; helper ();, you will run into a problem: What is the type of
helper? It should be a function pointer/reference. Java does not even have functions; in C++ you are equally at a loss for a proper type. (I'm not going into that actually the parameter types aka signature form a part of the method name.)
Indeed the compilers simply go to treat the combination
a.b(c)as a single operator. In Java the method and member name spaces are actually separate; a method can have the same name as a member. (Does that make it a Java-2?)
The only language that makes this explicit is Lua. Member invocation is
obj:meth(arg), which is the same as
objis only evaluated once).
I don't know of any language that does it properly. Even though a member function exists as code only once, logically there is a distinct function for each object. The member selection needs to bind the function code address and the object pointer together, into something that is quite similar to a closure.