Pass by value is not a problem for languages which default to making everything a reference.
But in C++, parameters default to value types unless you explicitly specify that they are taken by reference.
Furthermore, full copies happen on every assignment unless the assignment operator is overwritten to do something else.
class Foo {
int a;
double d;
uint64_t z;
}
Foo foo;
Foo bar = foo; // just made a copy of all of the guts of Foo.
In Java, that would have been assigning a reference.