Reputation: 6460
I am learning C++ and was reading copy constructor from the C++: The Complete Reference
. The books says that
It is permissible for a copy constructor to have additional parameters as long as they have default arguments defined for them. However, in all cases the first parameter must be a reference to the object doing the initializing.
But I am confused that how we are going to pass those additional parameters? I am sure there should be some way which is not given in the book and which I am unable to figure out. Can anyone help me out?
EDIT: Also is it possible to pass these extra parameters in all three cases i.e.
Upvotes: 9
Views: 4353
Reputation: 70412
Here is a simple example:
class A {
//...
public:
A (const A&, bool deep = false) {
if (!deep) { /* make a shallow copy */ }
else { /* make a deep copy */ }
}
};
void foo (A x) { /*...*/ }
A bar () { /*...*/ return A(); }
A a_var;
In this example, the parameter is defaulted to false, meaning the default copy constructor will be shallow.
A b(a_var); // b gets a shallow copy of a
foo(b); // foo() receives a shallow copy
However, it would be possible to effect a deep copy by passing in true in the second parameter.
A b(a_var, true); // b gets a deep copy of a
foo(A(b, true)); // foo receives a shallow copy of a deep copy
Similarly, for a function returning an A
, the returned copy would be shallow, since it is using the default, but the receiver can make it deep when it receives it.
A b(bar()); // shallow
A b(bar(), true); // deep
Remember when you define a copy constructor, it is likely to mean you will need to define a destructor and overload the assignment operator (the rule of three).
Upvotes: 13
Reputation:
Think of it this way: there is only the notion of constructor. When the compiler decides a copy needs to be made, it looks for a constructor that can be called by passing in a single object of type T
. Because of this special use case, we conventionally call the constructor chosen a "copy" constructor.
Upvotes: 1