实现普通构造函数、复制构造函数、析构函数,观察它们的执行时机。
根据类CTest的声明以及主函数的声明,完成函数定义,注意复制构造函数不复制编号num的值,只复制a,b的值。
要求对象初始化时,若执行普通构造函数,则输出 num object initial value:[a,b],若执行复制构造函数,则输出num object copy value:[a,b],若执行析构函数,则输出num object distruct,其中num为对象编号,从0开始,产生的第一个对象num应设为0,第二对象设为1,依次类推。提示:可以利用全局变量n来实现num值的自动设置。
裁判测试程序样例:
输入样例:
#include<iostream>
using namespace std;
int n = 0;
class CTest{
int a,b;
int num; //对象编号
public:
CTest(int , int);
~CTest();
CTest(const CTest&); //复制构造函数
};
void Testfunc(CTest a){
}
/* 请在这里填写答案,完成函数定义 */
int main(){
int a,b;
cin>>a>>b;
CTest t0(a,b);
CTest t1(t0); //复制构造函数调用
CTest t2 = t1; //复制构造函数调用
cout<<endl<<"run Testfunc"<<endl;
Testfunc(t0); //复制构造函数完成传参
cout<<"Testfunc return"<<endl<<endl;
}
在这里给出一组输入。例如:
9.9
输出样例:
在这里给出相应的输出。例如:
0 object initial value:[9,9]
1 object copy value:[9,9]
2 object copy value:[9,9]
run Testfunc
3 object copy value:[9,9]
3 object distruct
Testfunc return
2 object distruct
1 object distruct
0 object distruct
执行代码如下:
CTest::CTest(int x,int y):a(x),b(y),num(n){
cout<<num<<" object initial value:["<<a<<","<<b<<"]"<<endl;
n++;
}
CTest::~CTest()
{
cout<<num<<" "<<"object distruct"<<endl;
}
CTest::CTest(const CTest& c):a(c.a),b(c.b),num(n)
{
cout<<num<<" object copy value:["<<a<<","<<b<<"]"<<endl;
n++;
}
总结:
在主函数中,首先会创建对象t0,此时会调用普通构造函数,输出0 object inittial value:[a,b];
然后创建对象t1,此时调用复制构造函数,输出 1 object copy value:[a,b];
接着创建对象t2,同样调用复制构造函数 2 object copy value:[a,b];
然后调用Testfunc函数,传入的参数是对象t0,函数调用过程中会创建临时对象,此时会调用复制构造函数,输出3 object copy value:[a,b],并在函数返回时销毁临时对象。最后,程序结束时,会依次销毁所有创建的对象,依次输出2 object distruct、1 object distruct、0 object distruct。