#include <iostream>
using namespace std;
#include <string>
class Person
{
public:
int m_A;
int m_B;
};
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 + p2;
cout << "p3的m_A的值为"<< p3.m_A << endl;
cout << "p3的m_B的值为" << p3.m_B << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
上面代码在Person p3 = p1+ p2的时候就会报错,但是我们就是想实现这样加号的功能,p3中m_A和m_B的值是p1和p2下m_A和m_B相加的结果。
这种需求就需要使用C++中的加号运算符重载方式实现,在C++中,要实现加号运算符重载,有两个方法。
第一种就是在类内部写成员函数实现,第二种全局函数实现,两个方法都有一个功能的函数名称operator+(), 这个函数名称是固定,不能写其他,不然编译器就不知道我们在实现加号运算符的重载。
下面我们先来看看第一种方法,类的成员函数实现operator+()
2.成员函数实现加号运算符重载
类的成员函数实现operator+(),函数参数有至少一个参数,例如Person &p, 函数的返回值是Person类型,那么这个函数的代码就是下面这样。
// 加号运算符重载
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; //零花钱
};
3.全局函数实现加号运算符重载
有了前面代码基础和理解,直接写一个全局函数的实现。
// 2、全局函数重载+
Person operator+(Person &p1, Person &p2)
{
Person temp;
temp.m_A = p1.m_A + p2.m_A;
temp.m_B = p1.m_B + p2.m_B;
return temp;
}
/* 2022 04 04 */
// 运算符重载概念:对已有的运算符进行定义,赋予其另一种功能,用来适应不同的数据类型
// 加号运算符重载作用:实现两个自定义数据类型的运算
//
// 对于内置的数据类型:编译器知道如何进行运算
/*
如果我们把自己定义的数据类型(如自己定义的类)的变量进行计算,
那C++预定义的基本数据类型的运算符重载 将不再适合我们使用,
这时我们需要自行重载运算符。
*/
/* 注意事项 */
// 1、对于内置的数据类型的表达式的运算符是不可以改变的,默认的加法不可能计算出来是减法
// 2、不要滥用运算符
#include<iostream>
using namespace std;
// 加号运算符重载
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 = p1.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 = 2000;
// 成员函数重载+ 本质调用
Person p3 = p1.operator+(p2);
// 全局函数重载+ 本质调用
//Person p3 = operator+(p1,p2);
// 简化版
//Person p3 = p1 + p2;//没有与这些操作数匹配的 "+" 运算符
cout << "p3.m_A =" << p3.m_A << endl;
cout << "p3.m_B =" << p3.m_B << endl;
// 运算符重载,也可以发生函数重载
Person p4 = p1 + 10; // Person + int
cout << "p4.m_A =" << p4.m_A << endl;
cout << "p4.m_B =" << p4.m_B << endl;
}
int main()
{
test01();
system("pause");
return 0;
}