C++中为何允许重载Complex类的+操作符,却无法重载**操作符?
为什么C++里能重载
+却不能用operator**实现幂运算? 哈哈,这个问题戳中了C++运算符重载的核心规则——你只能重载语言本身已经存在的合法运算符,咱们掰碎了说:
先明确:
**根本不是C的合法运算符
你可能在Python这类语言里见过**作为幂运算符,但在C里,代码里写a**b会被编译器直接拆成a * (*b)——也就是先对b做指针解引用,再和a相乘,完全和幂运算没关系。既然语言本身就不存在**这个运算符,自然也就没有“重载它”的说法。为什么
operator+是合法操作?+是C内置的标准二元运算符,不管是用于int、float这类基础类型,还是自定义的Complex类,你都可以重载它——不管是作为类的成员函数,还是像你写的这种全局非成员函数Complex operator+(Complex& c1, Complex& c2),编译器都能明确识别你要重载的是+运算符,完全符合C标准。那复数的幂运算该怎么实现?
既然**走不通,咱们可以换这些方式:- 定义一个直观的命名函数,比如
Complex pow(Complex& base, int exponent),可读性拉满; - 退而求其次,重载
^运算符(虽然它原本是按位异或,但不少数值库会这么用),但一定要加注释说明用途,避免其他开发者误解; - 如果用C++11及以上版本,还可以考虑用
constexpr函数实现编译期的幂运算优化。
- 定义一个直观的命名函数,比如
内容的提问来源于stack exchange,提问作者user13575381
相关产品推荐
相关产品推荐

