环境:ide:Mac+clion
视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5
为什么要做深拷贝:
class Person {
public:
Person(){
cout << "默认构造函数"<<endl;
}
Person(int age,int height){
m_Age = age;
m_Height = new int(height);
cout << "有参构造函数!"<<endl;
}
~Person(){
if(m_Height != NULL){
delete m_Height;
m_Height = NULL;
}
cout << "析构函数执行"<<endl;
}
Person(const Person &p) {
this->m_Age = p.m_Age;
//this->m_Height = p.m_Height;//默认copy构造函数就是这样做的。 如果属性创建在堆之上,这里就不能这样做。
this->m_Height = new int(*p.m_Height);//这样就完成了深度copy的动作。这里堆m_Height重新赋值新的地址和堆空间。每个对象分别释放内存。
cout << "copy 构造函数执行!" << endl;
}
int m_Age;//年龄
int *m_Height;//身高
};
//在main中或者方法中执行下面的代码
Person p(1,2);
Person p2(p);//如果是浅copy,
// 也就是编译器提供的copy构造函数,这里就会报错。因为析构函数已经调用析构函数里面清除堆内存的操作。清空内存。
// 这里需要做深copy,什么叫做深copy,也就是需要重写copy 构造函数。
结论:
浅copy:就是编译器提供的copy构造函数
深copy:在堆区申请的空间进行copy操作。 每一个对象针对堆中申请的数据重新申请一块地址,copy一份。
如果属性存在堆空间获取的内存,那么就需要自己重写copy构造函数。来解决浅copy带来的问题。
初始化属性
class Person{
public:
//传统的初始化方式
// Person(int a,int b,int c){
// m_A = a;
// m_B = b;
// m_C = c;
// }
Person():m_A(10),m_B(20),m_C(30){
// 通过这种方式进行初始化属性。
}
Person(int a,int b,int c):m_A(a),m_B(b),m_C(c){
// 通过这种方式进行初始化属性。
}
int m_A;
int m_B;
int m_C;
};
//在main函数中执行:
// Person person(1,2,3);
// cout << person.m_A<<endl;
Person p;
Person person(1,2,3);
cout << person.m_A<<endl;
网友评论