- 当用一个对象去初始化同类的另一个对象时:
Complex c2(c1); Complex c2 = c1;
-
某函数的形参是类A的对象(非引用),该函数被调用时,该类的复制构造函数被调用。
-
某函数的返回值是类A的对象(非引用),该函数返回时,该类的复制构造函数被调用。
注意,对象间“赋值”并不引起复制构造函数被调用。
Complex a1, a2;
a2 = a1;//不会引起复制构造函数调用
#include <iostream>
using namespace std;
class Sample {
public:
int v;
Sample(int n = 0)
{
v = n;
}
Sample(const Sample& x)
{
v = x.v + 2;
}
};
void PrintAndDouble(Sample o) //作为函数参数时候会调用复制构造函数
{
cout << o.v;
cout << endl;
}
int main()
{
Sample a(5);
Sample b = a;//调用复制构造函数
PrintAndDouble(b);
Sample c = 20;
PrintAndDouble(c);
Sample d;
d = a;
cout << d.v;
return 0;
}
输出
9
22
5
更新:
当我们设计class时,必须问问自己,在此class之上进行“成员逐一初始化”的行为模式是否适当?如果答案肯定,我们就不需要另外提供copy constructor。但如果答案是否定的,我们就必须另行定义copy constructor,并在其中编写正确的初始化操作。(当浅复制发生错误时手动实现深复制)!