You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何实现内置类型与自定义类的双向+运算符重载?

当然可行!轻松实现内置类型在左侧的加法运算

完全没问题哦~Python的运算符重载机制里专门有对应的方法来解决这个“运算方向”的问题,咱们用**反向加法运算符__radd__**就能搞定。

先理清楚原理

你之前实现的__add__方法,是处理自定义类实例在左侧的情况(比如my_obj + 1.5)。但当内置类型在左侧时(比如1.5 + my_obj),Python会先尝试调用内置类型自身的__add__方法——显然它不知道怎么处理你的MyClass实例,这时候Python就会转而调用MyClass的__radd__方法,也就是“反向加法”,把运算顺序反过来处理。

具体实现代码

咱们直接在你的MyClass里加上__radd__方法就行,要是你的加法符合交换律(比如数值相加),甚至可以直接复用__add__的逻辑,省得重复写代码:

class MyClass:
    def __init__(self, value):
        self.value = value
    
    # 处理 MyClass实例 + 内置类型(int/float等)
    def __add__(self, other):
        if isinstance(other, (int, float)):
            return MyClass(self.value + other)
        raise TypeError(f"不支持与 {type(other)} 类型的对象相加")
    
    # 处理 内置类型 + MyClass实例
    def __radd__(self, other):
        # 加法满足交换律的话,直接调用__add__就好
        return self.__add__(other)
        
        # 如果你的场景不满足交换律,就单独写逻辑:
        # if isinstance(other, (int, float)):
        #     return MyClass(other + self.value)
        # raise TypeError(...)

测试一下效果

运行下面的代码就能验证:

my_obj = MyClass(10)
# 自定义类在左侧,调用__add__
result1 = my_obj + 5.5
print(result1.value)  # 输出15.5

# 内置类型在左侧,调用__radd__
result2 = 5.5 + my_obj
print(result2.value)  # 输出15.5

额外小提示

  • 如果需要支持更多内置类型(比如complex复数),只要在isinstance的类型元组里加上就行;
  • 如果__radd__遇到无法处理的类型,记得抛出清晰的TypeError,这样调试起来更方便;
  • 要是你的类还需要支持减法、乘法等其他运算的反向操作,对应的反向方法是__rsub__、__rmul__,逻辑和__radd__类似哦~

内容的提问来源于stack exchange,提问作者kaiyum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:15:38