虽然有可能超载^
来进行取幂,但你不应该这样做.这是个坏主意.
@AaronF的答案表明,执行此操作的代码是多么丑陋,但这只是冰山一角.当您尝试在实际代码中实际使用它时,真正的问题出现了.这些问题从一个简单的事实干:重载一个操作改变由操作者进行的操作,但并没有影响到任何的优先级,或者运营商的关联性.在这种情况下^
,优先级和关联性对于取幂都是完全错误的.
在C++中,^
运算符具有相当低的优先级.指数应该有很高的优先权.例如,如果我有一个表达式x^y*z
,我希望它意味着 - (x^y)*z
但它真正意味着什么x^(y*z)
.事实上,^
优先级甚至低于加法和减法,所以x^y+z
出错了 - 它意味着x^(y+z)
而不是(x^y)+z
你想要的.
指数是正确的关联 - 但在C++中,^
运算符是左关联的.例如,给出一个表达式x^y^z
,你想要的是它意味着x^(y^z)
什么,但你会得到什么(x^y)^z
.
这意味着如果你做超载operator^
来进行取幂,你就只能使用这个名字了pow
.你不会逃避大部分的括号; 在任何非平凡的表达式中,您仍然需要使用括号来强制执行正确的优先级和关联性,因为如上所述,C++赋予的优先级和关联性operator^
对于取幂都是完全错误的.
虽然你可以超载operator^
来进行取幂,但这是其中自由裁量权是勇气更好的部分之一.当您在C++中重载运算符时,您确实需要考虑三个因素:名称,优先级和关联性.为了实现良好的操作员过载,这三个应该是正确的.进行超载有时是合理的,只有三分之二是正确的,而第三个并不太远.在这种情况下,三个中只有一个甚至接近右边; 另外两个是完全错误的.
不要这样做.这是个坏主意.