生成两个完全相同的对象有两种方法,第一种就是将已有的对象的数据成员(member或称属性)取出来,一一赋值给新的对象。第二种方法就是使用复制构造函数,让类具有自行复制本类对象的能力。
复制构造函数:具有一般构造函数的所有特性,形参是本类的对象的引用。作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象。
个人理解:构造函数是用于创建一个类的新的对象。而复制构造函数就是复制一个已经存在的对象。(构造函数创建一个新的人,复制构造函数就是创建一个克隆人)。
#include<iostream>
using namespace std;
/*复制构造函数*/
//时钟类
class Clock{
public:
Clock(){ //无参构造函数实现-内联
hour=0;
minute=0;
}
Clock(int newH,int newM){//构造函数
hour=newH; //在类里的 函数中写了内容(即函数实现),就属于隐式内联函数
minute=newM;
}
Clock(Clock &c);//复制构造函数,类名(类名 &对象名);
int getH(){return hour;} //与上方 同理属于内联函数
int getM(){return minute;}
private:
int hour,minute;
};
//成员函数实现
Clock::Clock(Clock &c){//复制构造函数的实现
//没有在类中实现函数,也没有显示声明inline,所以不是内联函数
hour=c.hour;
minute=c.minute;
cout<<"调用了构造函数的复制copy"<<endl;
}
//形参为Clock类的对象函数
void showNewClock(Clock c){ //如果函数的形参是类的对象,调用函数时,进行形参和实参的结合。
cout<<"该函数调用了复制构造函数newClock H: "<<c.getH()<<endl;
cout<<"该函数调用了复制构造函数newClock M: "<<c.getM()<<endl;
}
//返回值为Clock类对象的函数
Clock clockFunction(){
Clock c(1,2);//这里创建了一个Clock的对象
return c; //函数返回了刚刚创建的对象c,
}
int main(){
Clock myClock(0,1);
Clock newMyClock(myClock);//用对象myClock初始化对象NewMyClock,复制函数被调用
//Clock newMyClock=myClock;//第二种方法,用对象myClock初始化对象NewMyClock,复制函数被调用
cout<<"myClock : "<<myClock.getH()<<" "<<myClock.getM()<<endl;
cout<<"newMyClock : "<<newMyClock.getH()<<" "<<newMyClock.getM()<<endl;
showNewClock(myClock); //函数的形参是类的对象,会调用复制构造函数
Clock testFunctionClock;
testFunctionClock=clockFunction();
cout<<"testFunctionClock : "<<testFunctionClock.getH()<<" "<<testFunctionClock.getM()<<endl;
return 0;
}