1. 定义
<类名> (const <类名>&);
class A
{
int x,y;
public:
A();
A(const A& a)
{
x = a.x+1;
y = a.y+1;
}
}
其中,const是为了防止在函数中修改实参对象,可以省略。
拷贝构造函数也可以带有其他参数,但这些参数必须要有默认值。
2. 调用
下面三种情况将会调用拷贝构造函数:
1)定义对象
2)把对象作为值参数传递给函数
3)把对象作为返回值
如果在类定义中没有给出拷贝构造函数,则编译程序将会为其提供一个隐式的拷贝构造函数,此时的拷贝构造函数跟Java中的克隆函数有点像。
当类定义中包含成员对象,成员对象的拷贝初始化可由成员对象类的拷贝构造函数来实现。
系统提供的隐式拷贝构造函数会去调用成员对象的拷贝构造函数,而自定义的拷贝构造函数则不会自动去调用成员的拷贝构造函数,这时,必须要在拷贝构造函数的成员初始化表中显式指出。
class A
{
}
class B
{
int z;
A a;
public:
B();
B(const B& b): a(b.a)
{
z = b.z;
}
}