That's not the reason. The copy constructor couldn't have possibly been defined as taking an instance of the type. T(T instance);
If the copy constructor takes a copy of an instance, how is that copy going to be constructed?
The other possibility would have been to pass a pointer, but then the first lines of every copy constructor ever would have been
1 2 3
T(const T *p){
if (!p)
return;
Passing references is usually more convenient for both the caller and the callee.