//4.5  运算符重载

//运算符重载概念:对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型



//4.5.1

//作用:实现两个自定义数据类型相加的运算

#if(0)

#include <iostream>

//➕号运算符重载

//1、成员函数重载?

//2、全局函数重载?


class Person
{
public:

	//1、通过成员函数重载+

	//Person operator+(Person& p)
	//{
	//	Person temp;
	//	temp.m_A = this->m_A + p.m_A;
	//	temp.m_B = this->m_B + p.m_B;

	//	return temp;
	//}

	int m_A;

	int m_B;

	



};


//2、通过全局函数重载+号
Person operator+(Person& p1, Person& p2)
{
	Person temp;

	temp.m_A = p1.m_A + p2.m_A;
	temp.m_B = p2.m_B + p2.m_B;

	return temp;
}

//函数重载的版本
Person operator+(Person& p1, int num)
{
	Person temp;

	temp.m_A = p1.m_A + num;
	temp.m_B = p1.m_B + num;

	return temp;
}

void test01()
{
	Person p1;

	p1.m_A = 10;
	p1.m_B = 10;
	
	Person p2;

	p2.m_A = 10;
	p2.m_B = 10;

	//成员函数重载本质的调用

	//Person p3 = p1.operator+(p2);

	//全局函数重载本质的调用
	
	//Person p3 = operator+(p1, p2);

	Person p3 = p1 + p2;

	//运算符重载也可以发生函数重载
	Person p4 = p1 + 100;        //Person + int

	std::cout << "p3.m_A = " << p3.m_A << std::endl;
	std::cout << "p3.m_B = " << p3.m_B << std::endl;

	std::cout << "p4.m_A = " << p4.m_A << std::endl;
	std::cout << "p4.m_B = " << p4.m_B << std::endl;
}



int main()
{
	test01();

	system("pause");

	return 0;

}

//总结1 :对于内置的数据类型的表达式的运算符是不可能改变的
//总结2 :不要滥用运算符重载

#endif