Using a reference means that there's no copy involved. If you had:
Books(const Books source)
Then the argument the caller passes would have to be copied to source
. If you use a reference instead, no copy is made. This provides better performance. With small amounts of data it doesn't matter much, because it's a simple class with no large amount of data. But with more complex classes, copying can be expensive. Using references avoids that problem.
However, in the case of copy constructors, avoiding a copy is vital. Not for performance reasons, but by the fact that copying involves a copy constructor. When the copy constructor gets called, another copy would have to be made if a reference was not used. That means another call to a copy constructor. There, yet another copy would have to be made. Yet another call to a copy constructor.
As you can imagine, this would result in an infinite amount of copy constructor calls. By using a reference this situation is avoided.