C++从入门到放弃之:拷贝构造和拷贝赋值

拷贝构造和拷贝赋值

浅拷贝和深拷贝

浅拷贝:数据共享double free

  • 概念
    如果类中包含了指针形式的成员变量,缺省的拷贝构造函数只是复制了指针本身,没有复制指针所指向的内存中的实际位置,这种拷贝方式被称为浅拷贝
    缺省到的拷贝是浅拷贝(拷贝的是地址编号)
  • 浅拷贝问题
    浅拷贝将导致不同的对象之间的数据共享,两个对象中的指针指向同一个内存空间,当在析构过程中 会引发double free(即对同一个对象进行多次释放),从而导致进程异常终止

深拷贝:拷贝指针所指向的实际内容

  • 概念
    为了避免数据共享的问题,以及double free问题,因此就必须自己定义一个支持复制指针所指向的内存的实际内容的拷贝构造函数,即深拷贝
    自定义拷贝构造函数要设置成深拷贝
  • 深拷贝的本质
    深拷贝本质就是如果类中有指针形式的成员变量,将会拷贝指针所指向的实际内存中的内容

拷贝赋值

  • 当两个自定义类型对象进行赋值运算时,比如i3=i2,编译器会将其处理为i3.opreator=(i2);这样的成员函数的调用形式,由拷贝赋值操作符函数进行赋值运算,其返回结果就是赋值表达式的结果
  • 如果自己没有定义拷贝赋值函数,编译器会自动为该类提供一个缺省的拷贝赋值函数,但是缺省的拷贝赋值函数和缺缺省的拷贝构造函数类似为浅拷贝,存在double free和数据共享问题,因此为了得到深拷贝效果,避免浅拷贝问题,需要自己定义深拷贝赋值函数
//定义一个A类
class A {
public:
	A(int a = 10):m_a(a){}
private:
	int m_a;
};
//定义一个A类的对象a1
A a1;
//定义一个A对象a2并使用a1进行初始化
A a2 = a1;//拷贝构造,创建时初始化
//定义一个A对象a3
A a3;
a3 = a1;//拷贝赋值
/*本质是拷贝赋值操作符的体现*/
a3 operator= (a1);
  • 拷贝赋值的实现
//当堆内存大小一致时:
类名& operator=(const 类名& that){
	cout<<"自定义拷贝赋值"<<endl;
	if(&that != this){
		*成员变量 = *that.成员变量;
	}
	return *this;//返回自引用
}
/*通常拷贝赋值函数的实现是先释放旧内存空间,再分配新的内存空间,将数据进行拷贝*/
类名& operator=(const 类名& that){
	cout<<"自定义拷贝赋值"<<endl;
	if(&that != this){//防止自赋值
		delete 成员变量;//释放旧内存
		成员变量指针 = new 新变量;//分配新内存
		*成员变量 = *that.成员变量;//拷贝新数据
	}
	return *this;//返回自引用
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值