【More Effective C++】条款21:用重载技术避免隐式类型转换

文章讲述了在C++中,如何避免隐式转换带来的临时对象开销,通过操作符重载规定至少一个操作数必须是用户定义类型。错误示例展示了不满足这个规则的情况:不能对整型直接进行操作符重载,导致编译错误。
  • 没有重载形式,upi3 = upi1 + 10和upi3 = 20 + upi2也能调用成功,因为进行了隐式转换
    • 增加重载函数,避免隐式转换过程中临时对象的构建和析构成本
  • C++中的操作符重载要求至少有一个操作数是用户定义的类型(如类或枚举类型)
    • 所以其中error位置的重载形式不可以
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨主任o_o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值