A copy constructor c++ is a special type of constructor that creates a new object as a copy of an existing object. An analog to understanding copy constructors could be the scenario of creating T-shirts. For example, if you wanted to create a new t-shirt in black color and change the logo on the shirt, you could copy another T-shirt of the same color.

Three major things which copy constructors are applied are in

  • Initialize one object from another of the same type
  • Copy an object to return it from a function
  • Copy an object to pass it as an argument to a function

The sample copy constructor c++ code below will show the three examples above

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// Copy constructor example code
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
#include <iostream>
using namespace std;
class MyClass
{
int val, copynumber;

public:
MyClass(int i); // Normal constructor
MyClass(const MyClass &o); // Copy constructor
~MyClass(); // Destructor
int getval() { return val; }
void setval(int i) { val = i; }

MyClass twice(); // Return an object
};
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// Normal constructor
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
MyClass::MyClass(int i)
{
val = i;
copynumber = 0;
cout << "Inside normal constructor\n";
}

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// Copy constructor
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
MyClass::MyClass(const MyClass &o)
{
val = o.val;
copynumber = o.copynumber + 1;
cout << "Inside copy constructor.\n";
}

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// Destructor
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
MyClass::~MyClass()
{
if(copynumber == 0)
cout << "Destructing original.\n";
else
cout << "Destructing copy " << copynumber << "\n";
}

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// Member that will return an object
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
MyClass MyClass::twice()
{
MyClass d(val * 2);
return d;
}

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// pass object by reference
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
void display(MyClass &ob) // no copy made
{
cout << ob.getval() << '\n';
}

//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
// pass object by value
//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
void change(MyClass ob) // copy created here
{
ob.setval(100); // no effect
cout << "val in change(): ";
display(ob);
}

int main()
{
MyClass ob1(10);
cout << "val in main: ";
display(ob1);

// pass by value example
change(ob1);
cout << "val after change(): ";
display(ob1);

// return object and assignment example
ob1 = ob1.twice(); // returns an object
cout << "val after ob1.twice(): ";
display(ob1);

return 0;
}
Share this post