Copy
constructor is
- a
constructor function with the same name as the class
- used
to make deep copy of objects.
There
are 3 important places where a copy constructor is called.
- When
an object is created from another object of the same type
- When
an object is passed by value as a parameter to a function
- When
an object is returned from a function
If a
copy constructor is not defined in a class, the compiler
itself defines one. This will ensure a shallow copy. If the
class does not have pointer variables with dynamically
allocated memory, then one need not worry about defining a
copy constructor. It can be left to the compiler's discretion.
But if
the class has pointer variables and has some dynamic memory
allocations, then it is a must to have a copy constructor.
For
ex:
class A //Without
copy constructor
{
private:
int x;
public:
A() {A = 10;}
~A() {}
}
class B //With copy constructor
{
private:
char *name;
public:
B()
{
name = new char[20];
}
~B()
{
delete name[];
}
//Copy constructor
B(const B &b)
{
name = new char[20];
strcpy(name, b.name);
}
};
Let us
Imagine if you don't have a copy constructor for the class B.
At the first place, if an object is created from some existing
object, we cannot be sure that the memory is allocated. Also,
if the memory is deleted in destructor, the delete operator
might be called twice for the same memory location.
This is
a major risk. One happy thing is, if the class is not so
complex this will come to the fore during development itself.
But if the class is very complicated, then these kind of
errors will be difficult to track.
In
Windows this will lead to an application popup and unix will
issue a core dump. A careful handling of this will avoid a lot
of nuisance.