For All Human Beings.......

Showing posts with label Copy constructor. Show all posts
Showing posts with label Copy constructor. Show all posts

Sunday, November 18, 2007

Copy constructor

What is copy constructor? Discuss two situations when a copy constructor is automatically invoked giving appropriate examples.

Copy constructor is

  • a constructor function (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.

  1. When an object is created from another object of the same type
  2. When an object is passed by value as a parameter to a function
  3. 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. (Find its example in BLUE colour)

For ex:
class A //Without copy constructor

{ private:
int x;
public:
A() {A = 10;}
~A() { }
};


class B //************** With copy constructor ************
{
private:
int month;
public:
B( int y) //********* Parameterized constructor ***********
{
month = y;
}
~B( )
{
cout << "destructor function invoked"; }

B( B &b) //*************** Copy constructor *************
{
month = b.month;
}

};


class B //With copy constructor
{
private:
char *name;
public:
B()
{
name = new char[20];
}
~B()
{
delete name[];
}
//Copy constructor
B(B &b)
{
name = new char[20];
strcpy(name, b.name);
}
};


Example : When an object is created from another object of the same type

class A
{ int a;
public:
A(int x )
{ cout <<"Constructor invoked ..."; a=x; } }Obj1(23); A Obj2=Obj1; }


Example :
1.
When an object is passed by value as a parameter to a function
2.
When an object is returned from a function


class time

{ int hr;
int min;
public:
time ( ) // ******** constructor function ********
{ hr = min = 0;}
void gettime(int x,int y) {hr=x;min=y;}
void showtime( ) { cout <<" : " <<<"\n";} };

time addtime( time T1, time T2)
{ time T3;
T3.hr =
T1.hr + T2.hr;
T3.min = T1.min + T2.min;
if (T3.min >= 60)
{ T3.min =T3.min - 60;
T3.hr = T3.hr+1;
}
return T3;
}

void main( )
{ time X1 (5,45); // Parameterized constructor Invoked
time X2 (7,40); // Parameterized constructor Invoked
time X3=addtime(X1,X2); // Copy Constructor invoked
X3.showtime( ); // This will show the time as 13 : 25
}