- 没有重载形式,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;
}