C++ 运算符重载
C++中预定义的运算符的操作对象只能是基本数据类型。
但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。
因此可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
1. +运算符重载
重载+
运算符,我们可以给+
重新定义其含义。
例如:
// 使用内置的+运算符操作进行int类型的运算
int a = 10;
int b = 20;
int c = a + b; // 结果为30
如果我们使用+
运算符来运算我们的自定义数据类型时,需要重载+
运算符才可以。
举个例子:有个我们自定义的数据类型Person,有height和weight两个属性
class Person
{
public:
int height; // 身高
int weight; // 体重
Person(int height, int weight)
{
this->height = height;
this->weight = weight;
}
};
我们定义两个对象p1和p2;
Person p1(10,10); // 将p1的两个属性设置为10,10
Person p2(20,20); // 将p2的两个属性设置为20,20
如果我们想对p1和p2进行height和weight的分别相加的运算通过,我们需要:
int heigt = p1.height + p2.height;
int weight = p1.weight + p2.weight;
当然我们也可以通过重载+
运算符进行运算:
有两种方式:
- 成员函数重载
// 成员函数重载+
Person operator+(Person &p)
{
Person temp; // 创建一个Person对象temp,用来临时存储 两个对象相加的值
temp.height = this->height + p.height;
temp.weight = this->weight + p.weight;
return temp; // 返回 temp,为Person类型的对象
}
成员函数重载的本质:
cout << p1.operator+(p2).height << endl;
可以简写为:cout << (p1 + p2).height << endl;
- 全局函数重载1
// 全局函数重载+
Person operator+(Person& q, Person& p)
{
Person temp;
temp.height = q.height + p.height;
temp.weight = q.weight + p.weight;
return temp;
}
这种只能两个两个进行操作,在VS2019以后,重载的+运算符的结果是一个纯右值,不能作为左值进行计算,所以多个类的实例连续相加会报错。只能两两相加。
- 全局函数重载2
//在全局区开辟一段内存,不在全局函数中开辟,防止函数执行完成后系统回收
Person temp;
// 全局函数重载+
Person& operator+(Person& q, Person& p)
{
temp.height = q.height + p.height;
temp.weight = q.weight + p.weight;
return temp;
}
返回引用,同时注意不要在栈中开辟空间。
这种可以实现链式操作。
全局函数重载的本质:
cout << operator+(p1, p2).height << endl;
可以简写为:cout << (p1 + p2).height << endl;
// 输出验证一下
cout << (p1 + p2).height << endl;
cout << (p1 + p2).weight << endl;
如果有两个以上的对象进行操作:链式操作
Person p1(10, 10); // 将p1的两个属性设置为10,10
Person p2(20, 20); // 将p2的两个属性设置为20,20
Person p3(30, 30); // 将p3的两个属性设置为30,30
Person p4(40, 40); // 将p3的两个属性设置为40,40
Person p5(50, 50); // 将p3的两个属性设置为50,50
// 输出验证一下
cout << (p1 + p2 + p3 + p4 + p5).height << endl; //输出 150(10+20+30+40+50)
cout << (p1 + p2 + p3 + p4 + p5).weight << endl; //输出 150(10+20+30+40+50)
由此可见,适当的使用运算符重载可以使程序更加简洁,方便编程。
-
运算符的重载与+
类似,可以根据自己的需要进行编程。