#include <iostream>
using namespace std;
class Sample {
public:
int v;
// 在此处补充你的代码
Sample(){
}
Sample(int j){
v = j ;
}
Sample(const Sample & f){
v = f.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;
}
在main函数中,Sample a(5);应使用含一个int型的参数对此对象进行初始化,Sample b = a;并不是一个赋值语句,而是利用对象a对b进行初始化,此时需要一个复制构造函数来使用对象a中的参数对b进行初始化,Sample d;定义了一个对象而未对其进行初始化,那么就会自动调用一个默认的构造函数来对其进行初始化,因为已经定义了其他有参数的构造函数,那么定义一个无参的空的默认构造函数是不可省略的。在使用函数PrintAndDouble( )时,函数使用的形参是一个对象,输出的结果是对象的一个参数,那么就需要一个复制构造函数来对此对象进行初始化。
输出结果为9 22 5,先看对象d,对象d是由对象a对其赋值得到的,对象间的赋值并不会导致赋值构造函数被调用,,在程序执行过程中也并未对a的参数进行修改,所以d.v应与a.v一致,即有a.v = 5;那么此a所使用的含有一个参数的构造函数应将括号内的5的值赋给a.v,即有:
Sample(int j){
v = j ;
}
Sample c = 20;是用一个int型的常量对其进行初始化,而c是一个对象,所以需要一个构造函数将int型的参数赋值给对象c的参数c.v;利用以上的含一个构造函数就能够实现,此时c.v = 20;经过函数PrintAndDouble(c)后,c.v的值变为了22,说明了调用函数PrintAndDouble时所使用的赋值构造函数把c.v的值增加了2,所以定义的复制构造函数应如下:
Sample(const Sample & f){
v = f.v + 2;
}
现在我们来看下对象b的操作过程,Sample b = a;用对象a来初始化对象b,会调用复制构造函数,初始化后b.v = 7,执行PrintAndDouble(b)函数时又一次调用复制构造函数,输出结果时b.v =9;
运行结果: