C++赋值运算符重载及深浅拷贝的问题

C++赋值运算符重载

在C++中创建对象时编译器会自动添加帮我们写好赋值重载,用于对属性的值进行拷贝
例如:

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

class person
{
private:

public:
	int m_age;
	string m_name;
	person(/* args */);
	person(string name,int age)
	{
		m_name=name;
		m_age=age;
	}
	~person();
};

person::person(/* args */)
{
}

person::~person()
{
}


int main() {
	person p1("张三",18);
	person p2;
	p2=p1;//这是赋值,不是拷贝构造

	cout<<"姓名="<<p2.m_name<<','<< "年龄="<<p2.m_age<<endl;
	


	system("pause");

}

p2的属性输出:
在这里插入图片描述
说明:以上是由编译器帮我们写好的赋值重载,可以看出只是对属性值的拷贝。如果我们类属性改为是指向栈区里的
例如:

	person(string name,int age)
	{
		m_name=name;
		m_age=new int(age);//将年龄放在栈区
	}

那么就要考虑深浅拷贝的问题。


解决方法:

我们自己写赋值重载
例如:

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

class person
{
private:

public:
	int * m_age;
	string m_name;
	person(/* args */)
	{

	}
	person(string name,int age)
	{
		m_name=name;
		m_age=new int(age);
	}
	person& operator=(person &p)//重载赋值运算符
	{
		m_name=p.m_name;
		m_age=new int(*p.m_age);
		return *this;
	}
	~person()
	{
		if(m_age!=NULL)
		{
			delete(m_age);
			m_age=NULL;
		}
	}
};


int main() {
	person p1("张三",18);
	person p2;
	p2=p1;//这是赋值,不是拷贝构造

	cout<<"姓名="<<p2.m_name<<','<< "年龄="<<*p2.m_age<<endl;
	


	system("pause");

}

在这里插入图片描述
说明:这个案例如果用的是编译器提供的赋值重载,因为仅仅对属性值的拷贝导致有两个int * 指针指向同一块空间,那么在析构的时候就会造成一块内存被释放两次的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值