深拷贝与浅拷贝

1.析构顺序

在程序中先创建的对象后析构

Person p1;

Person p2;

p2先析构。

2.值类型与引用类型

在介绍深拷贝与浅拷贝之前,我们要再次强调一下引用类型与值类型。

值类型:存储区域存放的是变量的值。

引用类型:存储区域存放的是值变量的地址,可以根据值的地址找到值。

3.数据的存储 

数据分配内存由两种方式:直接分配与动态创建。

直接分配: int a[3] = {0};直接创建的数据分配的内存在栈中。

动态创建:int *a = new int[3];动态使用malloc或者new创建的数据创建在堆区中。

 

4. 浅拷贝与深拷贝

若在成员变量中含有指针变量,先释放指针指向的空间,再释放对象所占用的空间。因为堆区的内存需要程序员手动释放。

4.1 浅拷贝

class Person {
public:
	int m_age;
	int* m_score;
	//有参构造函数
	Person(int age, int score) {
		m_age = age;
		m_score = new int(score);
	}
	//析构函数
	~Person() {
		if (m_score != NULL) {
			delete m_score;
		}
}
	//系统默认实现的拷贝构造函数
	Person(const Person &p) {
		m_age = p.m_age;
		m_score = p.score;
	}
};

int main() {
	Person p1(10, 95);
	cout << *p1.m_score << endl;

	Person p2(p1);
	//先构造后析构先析构p2,再p1
}

这里实现的是浅拷贝,无法输出 *p2.score,会提示p2为null是因为拷贝函数是const 引用实现 ,所以p1 p2共同指向一片空间,当析构p2时,p2所指向的空间在析构p1时会被重复释放。

4.2  深拷贝 

//自己创建拷贝构造函数
Person(const Person &p) {
	m_age = p.m_age;
    m_score = new int(*p.m_score);
}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值