Why copy constructor will take reference object as argument?
Because if it's not by reference, it's by value. To do that you
make a copy, and to do that you call the copy constructor. But to
do that, we need to make a new value, so we call the copy
constructor, and so on...
(You would have infinite recursion because "to make a copy, you
need to make a copy".)