The copy constructor is needed in many situations, even if you do not call it explicitely. Some examples are:
1. Pass an object as a function argument by value
2. Return an object from a function by value
3. Create a temporary copy, e. g. when overriding the postifx operators ++ or --
while you can choose to work around the third case, and may (in fact, should!) pass a const reference instead of a value in the first case, the second case cannot be easily avoided.
Note that often, but not always, the assignment operator can be used instead of the copy constructor. these two are closely related.
See
http://www.cplusplus.com/articles/y8hv0pDG/[
^] for more info.