If a class contains members that are pointers initialized by new then you should define a copy constructor that copies the pointed-to data instead of copying the pointers themselves. This is termed deep copying. The alternative form of copying (memberwise or shallow copying) just copies pointer values. A shallow copy is just that the shallow scraping off of pointer information for copying rather than the deeper mining required to copy the constructs referred to by the pointers.
The overloaded assignment operator is used when you assign one object to another existing object:
The solution for the problems created by an inappropriate default assignment operator is to provide your own assignment operator definition one that makes a deep copy. The implementation is similar to that of the copy constructor but there are some differences.
1. Because the target object may already refer to previously allocated data the function should use delete[] to free former obligations.
2. The function should protect against assigning an object to itself; otherwise the freeing of memory described previously could erase the object's contents before they are reassigned.
3. The function returns a reference to the invoking object.