A copy constructor copies an object to current(this) object. Rather passing by value which may have more overheads, it is passed by address so the address of the object is assigned to newly created object(this). So it is more cleaner.
The copy constructor is invoked only when a new object is created via a copy from a previous existing one. Whenever the object is already created (say foo) and you write something like foo=another_foo, then the assignment operator is invoked. As a general rule, whenever you define a copy constructor you should also overload the assignment operator.