操作符重载
操作符重载实现
#include <iostream>
using namespace std;
class MyClass
{
private:
int mValue;
public:
int getValue();
void setValue(int value);
MyClass(int value);
MyClass operator+(MyClass c) {
MyClass myClass(0);
myClass.mValue = mValue + c.mValue;
return myClass;
}
MyClass operator-(MyClass c) {
MyClass myClass(0);
myClass.mValue = mValue - c.mValue;
return myClass;
}
};
操作符重载使用
MyClass myClass1(20);
MyClass myClass2(30);
MyClass myClass = myClass1 + myClass2;
cout << myClass.getValue() << endl;
myClass = myClass1 - myClass2;
cout << myClass.getValue() << endl;
函数形式的操作符重载
实现
MyClass operator*(MyClass &left, MyClass &right)
{
MyClass myClass(0);
myClass.setValue(left.getValue() * right.getValue());
return myClass;
}
使用
myClass = myClass1 * myClass2;
cout << myClass.getValue() << endl;
操作符重载的规范
- 重载后的操作数至少有一个是用户自定义类型,为了防止用户重载基本类型的操作符
错误示例:
int operator+(int left, int right)
{
return (left + right)*2;
}
- 不能改变操作符本身的特性,例如,不能将二元操作符变成一元或三元操作符
错误示例:
int operator+(int left, MyStruct myStruct, int right)
{
return left + myStruct.getValue();
}
// int right这个参数是不被允许的
int operator+(int left)
{
return left;
}
// 只有一个参数是不能运算+的
- 不能修改操作符的优先级
- 不能创建新的操作符
错误示例:
int operator+&^%$(int left, MyStruct myStruct)
{
return left;
}
int a = myStruct +&^%$ 4;
- 并不是所有的操作符都可以重载,例如sizeof、指针(*),?:(条件操作符)等
- 大多数可以重载的操作符都可以使用成员方法和非成员方法(函数形式)重载,但
赋值:=,函数调用:(),下标运算符:[],通过指针访问成员:-> 只能通过成员方法重载