C++中预定义的运算符的操作对象只能是基本数据类型。
但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。
因此可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。
重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
重载+
运算符,我们可以给+
重新定义其含义。
例如:
// 使用内置的+运算符操作进行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;
// 全局函数重载+ Person operator+(Person& q, Person& p) { Person temp; temp.height = q.height + p.height; temp.weight = q.weight + p.weight; return temp; }
这种只能两个两个进行操作,在VS2019以后,重载的+运算符的结果是一个纯右值,不能作为左值进行计算,所以多个类的实例连续相加会报错。只能两两相加。
//在全局区开辟一段内存,不在全局函数中开辟,防止函数执行完成后系统回收 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)
由此可见,适当的使用运算符重载可以使程序更加简洁,方便编程。
-
运算符的重载与+
类似,可以根据自己的需要进行编程。