There are several reasons we use references like this. If at all poss it should be const and only nonconst if absolutely necessary.

Why not pass by value?
To pass by reference theres little to no overhead whereas to pass by value we would have to copy our object to the stack. It gets worse if we had inherited our passed class from another class and the function took the base class as a parameter then the object passed would become sliced and forever be a base object instead of a derived. So to combat these problems we always pass by reference. This also opens up the door to polymorphism where we make functions that take a base class reference and then give them derived objects and the right thing is done, but lets not walk before you can run.