一 拷贝构造函数
一 初识
同一个类的一个对象去 构造 或者 初始化 另一个对象
-
用处:用一个对象创建另一个对象
-
特点:第一个参数必须是当前类的对象的引用const
二 调用时机
一 使用一个对象给另一个同类对象初始化
class Monster {};
int main()
{
Monster obj_m(80);
Monster obj_test = obj_m;
}
二 使用一个对象直接构造另一个同类对象
class Monster {};
int main()
{
Monster obj_m(80);
Monster obj_test(obj_m);
}
三 函数的参数是类的对象
class Monster {
public:
Monste();
Monster(int hp);
~Monster();
Monster(const Monster & monster);
};
int main()
{
Monster obj_m(80);
Monster obj_test = obj_m;
}
四 函数的返回值是类的对象
#include<iostream>
using namespace std;
class Monster
{
public:
Monster();
Monster(int hp);
~Monster();
Monster(const Monster& monster);
int getHp(){
return hp;
}
private:
int hp;
};
Monster::Monster()
{
hp = 100;
cout <<"无参构造被调用"<< endl;
}
Monster::Monster(int hp)
{
this->hp=hp;
cout<<"带参构造被调用"<<endl;
}
Monster::~Monster()
{
cout<<"析构函数被调用"<<endl;
}
Monster::Monster(const Monster &monster)
{
//完成对应属性一一赋值的操作
this->hp = monster.hp;
cout<<"拷贝构造函数被调用"<<endl;
}
Monster testFunc_1()
{
Monster obj;
return obj;
}
Monster testFunc_2()
{
return Monster();//匿名对象
}
int main()
{
Monster obj = testFunc_1();
Monster obj = testFunc_2();
Monster obj_1 = Monster();
return 0;
}
二 浅拷贝与深拷贝
一 浅拷贝
将对应属性一 一赋值的操作
二 深拷贝
#include<iostream>
using namespace std;
class MyData {
public:
MyData();
MyData(int n,int v,int m);
MyData(const MyData& mydata);
~MyData();
private:
int num;
int val;
int*pArr;
public:
void showData();
};
MyData::MyData()
{
num = 0;
val = 1;
pArr = new int(10);
}
MyData::MyData(int n,int v,int m)
{
num = n;
val = v;
pArr = new int;
*pArr = m;
}
MyData::MyData(const MyData& mydata)
{
浅拷贝:
//this->num=mydata.num;
//this->val=mydata.val;
//this->pArr=mydata.pArr;
//深拷贝:
this->num=mydata.num;
this->val=mydata.val;
pArr=new int;
//
*(this->pArr)=*(mydata.pArr);
pArr[0]=mydata.pArr[0];
}
MyData::~MyData()
{
delete pArr;
pArr=NULL;
}
void MyData::showData()
{
cout<<"num="<<num<<"val="<<val<<endl;
cout<<"*pArr="<<*pArr<<endl;
cout<<"****************"<<endl;
}
int main()
{
MyDatam1(3,4,9);
m1.showData();
MyDatam2=m1;
m2.showData();
return 0;
}