
A copy constructor is a special constructor in the C++ programming language used to create a new object as a copy of an existing object. This constructor takes a single argument: a reference to the object to be copied.
Normally the compiler automatically creates a copy constructor for each class (known as an implicit copy constructor) but for special cases the programmer creates the copy constructor, known as an explicit copy constructor. In such cases, the compiler doesn't create
one.
A copy constructor is generally needed when an object owns pointers or non-shareable references such as to a file and then you usually need a destructor and assignment operator too.
Copying of objects is achieved by the use of a copy constructor and a copy assignment operator. A copy constructor has as its first parameter a (possibly const or volatile) reference to its own class type. It can have more arguments, but the rest must have default values associated with them.[1] The following would be valid copy constructors for class X:
X(X const&); X(X&);
X(X const volatile&); X(X volatile&);
X(X const&, int = 10); X(X const&, double = 1.0, int = 40);
The first one should be used if a good reason to use one of the others does not exist. One of the differences between the first and the second is that temporaries can be copied with the first. For example:
X a = X(); // valid if you have X(X const&) but not valid if you have X(X&)
// because the second can't hold a temporary
Another difference between them is the obvious:
X const a; X b = a; // valid if you have X(X const&) but not valid if you have X(X&)
// because the second wants a non-const X&
The X& form of the copy constructor is used when it is necessary to modify the copied object. This is very rare but it can be seen used in the standard library's std::auto_ptr. A reference must be provided:
X a; X b = a; // valid if any of the copy constructors is defined
// since you're passing in a reference
The following are invalid copy constructors (or regular constructors):
X(X); X(X const);
because the call to those constructors would require a copy as well, which would result in an infinitely recursive call.
There are four instances when a copy constructor is called:
An object can be assigned value using one of the two techniques:
Explicit assignment in an expression
Object A; Object B;
A = B; // translates as Object::operator=(const Object&), thus A.operator=(B) is called
Initialization
An object can be initialized by any one of the following ways.
a. Through declaration Object B = A; // translates as Object::Object(const Object&)
b. Through function arguments type function (Object a);
c. Through function return value Object a = function();
The copy constructor is used only in latter case (initializations) and doesn't apply to assignments where the assignment operator is used instead.
The implicit copy constructor of a class calls base copy constructors and copies its members by means appropriate to their type. If it is a class type, the copy constructor is called. If it is a scalar type, the built-in assignment operator is used. Finally, if it is an array, each element is copied in the manner appropriate to its type.[2]
By using an explicit copy constructor the programmer can define the behavior to be performed when an object is copied.
These examples illustrate how copy constructors work and why they are required sometimes.
Let us consider the following example.
#include
class Person