深拷贝与浅拷贝

浅拷贝:简单的值传递(若存在堆区的对象成员,即拷贝其指针指向的地址)
深拷贝:需要在堆区重新开辟新的空间,传递新内存空间的地址

若类对象的成员变量(属性)有在堆区开辟的,一定需要自己构造拷贝构造函数(深拷贝),防止浅拷贝带来的多次释放堆区空间问题。

下面通过例子具体说明:

#include <iostream>
#include <string>
using namespace std;

// 深拷贝与浅拷贝
//浅拷贝:简单的值传递(若存在堆区的对象成员,即拷贝其指针指向的地址)
//深拷贝:需要在堆区重新开辟新的空间

class Person{
private:
	string Pname;
	int* Page;
public:
	//有参构造函数(若用户自定有参构造函数,则系统不默认生成无参构造函数)
	Person( string name, int age ){
		Pname = name;
		Page = new int(age);	//堆区开辟空间存储age
	}
	
	//拷贝构造函数(若用户自定拷贝构造函数,则系统不默认生成无参构造函数)
	Person( const Person& person ){
		Pname = person.Pname;
		//Page = person.Page;	//浅拷贝:只拷贝Page指针指向的堆区地址
		Page = new int(*person.Page);	//深拷贝:在堆区开辟新空间存储age,Page指向该地址
	}

	//析构函数:清除程序员在堆区开辟的空间
	~Person(){
		cout<<"delet age:"<<*Page<<endl;
		if( Page != NULL){
			delete Page;
			Page = NULL;
		}
	}
	
	void showPerson(){
		cout<<"(name,age):"<<Pname<<","<<*Page<<endl;
	}

};

int main(){
	string name1 = "yiket";
	int age1 = 18;
	Person p1(name1, age1);
	Person p2(p1);
	p1.showPerson();
	p2.showPerson();
	
}

浅拷贝:多次释放同一堆区空间问题

深拷贝:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值