The '&' is just a 'silent pass by pointer reference compiler directive', efficient if you want to do less copying of a large object, and potentially allowing modification of the original since the called method has access to the original, not a copy. I call it silent (and have mixed feelings about it as a direction) because, unlike the C practice of explicit pass by pointer reference, this one is invisible when calls are instantiated unless you refer to the function/method declaration. Saving the programmer keystrokes and encouraging pass by reference but also improving the chances of programmer error.
Modifying the original passed by reference is a good segue into const, with is more often used in call declarations to say the called method cannot directly modify the original. Of course, if the called method can call a class method that modifies, that gets a bit thin -- it was more for primitives -- look but do not change. Using const on a declaration says that the initialized value is the only value, it can never be changed, so it can be copied freely, cached without worrying about having a stale copy, a bit like final, but once that was just JAVA.
Java's final vs. C++'s const - Stack Overflow
Const can have either of two meanings with pointers, const pointer or pointer to const data:
C++ Reference - Const Pointers - Cprogramming.com
Quick interview question -- what are the three meanings of static?