- 没有重载形式,upi3 = upi1 + 10和upi3 = 20 + upi2也能调用成功,因为进行了隐式转换
- 增加重载函数,避免隐式转换过程中临时对象的构建和析构成本
- C++中的操作符重载要求至少有一个操作数是用户定义的类型(如类或枚举类型)
class UPInt {
public:
UPInt() : _value(0) {}
UPInt(int value) : _value(value) {}
int value() const { return _value; }
// const UPInt operator+(const UPInt& other) {
// return UPInt(_value + other.value());
// }
private:
int _value;
};
const UPInt operator+(const UPInt& lhs, const UPInt& rhs) {
return UPInt(lhs.value() + rhs.value());
}
// 重载形式
const UPInt operator+(int lhs, const UPInt& rhs) {
return UPInt(lhs + rhs.value());
}
const UPInt operator+(const UPInt& lhs, int rhs) {
return UPInt(lhs.value() + rhs);
}
// error: ‘const UPInt operator+(int, int)’ must have an argument of class or enumerated type
// const UPInt operator+(int lhs, int rhs) {
// return UPInt(lhs + rhs);
// }
int main() {
UPInt upi1, upi2;
UPInt upi3 = upi1 + upi2;
upi3 = upi1 + 10;
upi3 = 20 + upi2;
// upi3 = 10 + 20;
return 0;
}