浅拷贝和深拷贝的区别在于浅拷贝只是将对象的值复制给另外一个对象,如果这时候他们有一个在堆区开辟空间的变量,那么这个堆区地址也会共享
深拷贝是在赋值时是给变量重新开辟一个新的内存空间,这时候,对象之间的地址不共享
核心在于堆区空间的开辟。
虽然这个知识点看着很简单,但是还是建议大家画一下图和写一下代码,毕竟学习就像逆水行舟,你不进步,那就只能退不。
刚开始复习这个考点,有不对的地方还希望大佬们斧正。
浅拷贝:
深拷贝:
深拷贝变量在堆区地址:
实验代码:
#include<iostream>
using namespace std;
//深拷贝与浅拷贝
//浅拷贝出现错误的地方在对m_height进行释放时会重复释放两次
//导致出现段错误
class Person
{
public:
Person()
{
m_age = 0;
//在堆区初始化
m_height = new int(0);
}
Person(int age, int height)
{
m_age = age;
m_height = new int(height);
}
//系统默认的拷贝构造函数
//浅拷贝
/*Person(const Person& p)
{
m_age = p.m_age;
m_height = p.m_height;
}*/
//深拷贝拷贝构造函数
/*Person(const Person& p)
{
//深拷贝是在堆区开辟一块新的空间给新的对象使用
m_age = p.m_age;
m_height = new int(*p.m_height);
}*/
~Person()
{
delete m_height;
m_height = NULL;
}
int m_age;
int* m_height;
};
void t0()
{
Person p1(16, 160);
cout << p1.m_age << " " << p1.m_height << endl;
//调用自己定义的拷贝构造函数或者系统化默认的拷贝构造函数
Person p2(p1);
cout << p2.m_age << " " << p2.m_height << endl;
}
int main()
{
t0();
return 0;
}