C++重载赋值运算符

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


/************************************************************************

赋值运算符重载
1.数据成员需要再堆区申请空间,则对象赋值时,存在深拷贝

/************************************************************************/

class Person{
	//全局函数声明为该类的友元,可以访问该类的私有成员
	friend ostream & operator<<(ostream &cout, Person &per);

public:

	//有参构造
	Person(int age, char* name)
	{
		m_age = age;
		m_name = new char[strlen(name)+1];
		strcpy(m_name, name);
	}
	//重载赋值运算符,否则系统提供默认拷贝构造函数(浅拷贝)会导致堆区内存多次释放
	//为了能支持链式赋值per3=per2=per1,需要返回类的对象或引用
	Person & operator=(const Person &per)
	{
		m_age = per.m_age;
		//先释放原堆区空间,再重新申请
		if (m_name != NULL)
		{
			delete m_name;
		}
		m_name = new char[strlen(per.m_name)+1];
		strcpy(m_name, per.m_name);
		return *this;//返回类的对象
	}

	~Person()
	{
		if (m_name != NULL)
		{
			delete m_name;
			m_name = NULL;	
		}	
	}
private:			
	int m_age;
	char *m_name;
};

//使用全局函数重载<<运算符
ostream & operator<<(ostream &cout, Person &per)
{
	cout<<per.m_age<<","<<per.m_name;
	return cout;
}

void test1()
{
	Person per1(20, "Tom");
	Person per2(30, "Jerry");

	cout<<per1<<endl;
	cout<<per2<<endl;

	Person per3(40,"zhangsan");
	
	//链式赋值
	per3 = per2 = per1;
	
	//per2和per3一样
	cout<<per2<<endl;
	cout<<per3<<endl;

	
}



int main()
{
	test1();


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值