深拷贝和浅拷贝理解

所谓浅拷贝就是系统自带默认的拷贝构造函数,类都有一个默认的拷贝构造函数,注意这里是拷贝构造函数不是拷贝函数。之所以要强调构造是说这个功能只限于在构造阶段使用,而不是其他赋值阶段使用。浅拷贝有一个问题就是他只能拷贝类中定义的那些在栈上分配的变量,比如private int a,int b,等。但是不能处理类中有指针定义,然后通过如构造函数new空间,析构函数delete空间的场景。因为如果在构造时候直接拷贝的话,会将类中已经new出来的内存地址拷贝到另一个类对象中去保存,然后在另一个类中调用析构时候,就会delete这个指针,的人这个指针其实在被拷贝那个对象中可能已经delete了。所以存在重复释放内存的问题。所以此时就引出了深拷贝的问题。所谓深拷贝就是类需要写一个函数来实现更复杂的初始化工作,比如重新new一个空间,而不是借用被拷贝对象的new地址。

深拷贝,浅拷贝使用的场景是定义对象时候的初始化赋值语句汇总。比如:

Base a;
Base b(a) 或者Base b = a;
/*这里是不是赋值运算,而是调用的深拷贝构造函数实现了类之间的赋值初始化,
他和b=a赋值语句是不一样的,赋值语句是调用的重载=运算符计算的*/

拷贝构造函数的格式如:

class Base {
public:
	Base(){}
	~Base(){
		delete [] ptr;
	}
	/*深拷贝构造函数,如果是浅拷贝系统默认已经有,不需要自行编写*/
	Base(const Base &another){
		ptr = new char[strlen(another.ptr)];/*重新分配内存空间*/
	}
Private:
	char *ptr;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值