在c ++中正确过载功率?

时间:2012-11-15 17:42:42

标签: c++ operators operator-overloading xor

在c ++中,我实现了一个integer类,我重载了operator ^作为幂函数。

integer integer::operator^ (const integer& rhs){
       return integer(pow(this->.i, rhs.i));
}

这适用于两个操作数。

integer i1, i2, i3 ;   
 i4 = i1 ^ i2 ^ i3;  

i4的值在数学上是错误的,因为关联性需要从右到左。我怎么解决这个问题?如何更改关联性?

我得到了合理的答案,我学到了:

-We can't change  associativity or priority of an operator.   
-Good is Not to overload operators to do something conceptually different to 
 the built-in versions  
-Even compiler can't support; it hard to implement!  

1 个答案:

答案 0 :(得分:10)

您不能通过重载来更改C ++中运算符的关联性或优先级。这些规则硬连线到语言语法中。

C ++标准说(§13.5.6,强调我的):

  

运算符函数应该是非静态成员函数或者是非成员函数并且具有   至少一个参数,其类型是类,对类的引用,枚举或对引用的引用   列举。 无法更改运算符的优先级,分组或操作数。   每种类型预定义的operator =,(一元)&,和(逗号)的含义可以改变[...]

^运算符不仅是左关联的,而且是it also has a very low precedence。幂运算符的正确优先级应高于乘法(因此该表的优先级为4或更高),但它具有优先级10 - 这意味着在它之前评估偶数加法和减法。 1 + 2 ^ 3 * 4将被解析为(1 + 2) ^ (3 * 4),而数学上正确的幂运算符应解析为1 + (2 ^ 3) * 4

如果可以修改运算符的关联性或优先级,则会发生巨大的,巨大的语法混乱。我的拙见是,你不应该试图让^运算符超载以将其用作幂运算符。我宁愿在课堂上制作一个power方法。