c++的赋值操作符以及浅深拷贝

	拓展:当使用赋值操作符时,要注意对象中是否有指针变量。如果有,则要注意是进行深拷贝还是浅拷贝。
拷贝运算:生成全新的一个对象,即调用复制构造函数之前=左边的对象不存在
class1 A; 
class1 B = A;//浅拷贝

赋值运算:处理两个已有对象
class1(int tid,char* tname){
id = tid;
name = new char[Max];//为了本例而new 放在heap
strcpy(name,tname);
}
~class1(){
	delete name;//一般都是在析构内delete掉
}
class1 A(1,"122");
class1 b;
B = A;//缺省的赋值运算B.operator=(A);

缺省的赋值运算:对象中的所有位于stack中的域,进行相应的复制。但是,如果对象有位于heap上的域的话,其不会为拷贝对象分配heap上的空间,而只是指向相同的heap上的同一个地址,所以B=A即
在这里插入图片描述
但一个创建两个对象所以会delete两次name,而name的字符串在heap空间只有一个,会报异常。
解决方法:重载赋值运算符
让不同对象的成员域指向不同的heap地址。

A & operator =(A& a){//返回对象的引用!!!
	if(name != null) delete name;//要释放掉对象自身的堆空间(如果需要的话)
	this->id = a.id;
	int len = strlen(a.name);
	name = new char[len+1];//在heap上创建新的地址放
	strcpy(name, a.name);
	return *this;
}
1. 释放掉原来对象所占有的堆空间
2. 申请一块新的堆内存
3. 将源对象的堆内存的值copy给新的堆内存
4. 返回源对象的引用

A operator =(A& a){...}//返回对象的本身
5. 释放对象原来的堆资
6. 申请一块新的堆内存
7. 将源对象的堆内存的值copy给新的堆内存
8. 创建临时对象(调用临时对象拷贝构造函数),将临时对象返回
9.  临时对象结束,调用临时对象析构函数,释放临时对象堆内存
如果使用默认的拷贝构造函数,临时对象只是指向了heap的地址,当释放时释放的时目标对象的heap空间,当B调用析构(再次释放)会报错.

在这里插入图片描述
拷贝函数

class A{
public...
	A(A &a);
}

A(A &a){//重载拷贝函数
	id = a.id;
	int len = strlen(a.name);
	name = new char[len+1];//在heap上创建新的地址放
	strcpy(name, a.name);
}
//无需返回值
//无需要释放掉对象自身的堆空间,因为拷贝函数这时对象还没有分配堆空间,
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值