3

在 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!  
4

1 回答 1

11

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

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

操作符函数要么是非静态成员函数,要么是非成员函数,并且至少有一个类型为类、类引用、枚举或枚举引用的参数。不能更改运算符的优先级、分组或操作数的数量。 为每种类型预定义的运算符 =、(一元)& 和 ,(逗号)的含义可以更改 [...]

运算符不仅是^左结合的,而且它的优先级也很低。幂运算符的正确优先级应该高于乘法(因此此表中的优先级为 4 或更高),但它的优先级为 10——这意味着即使是加法和减法也会在它之前进行计算。1 + 2 ^ 3 * 4将被解析为(1 + 2) ^ (3 * 4),而数学上正确的幂运算符应解析为1 + (2 ^ 3) * 4.

如果可以修改运算符的关联性或优先级,则会出现巨大的语法混乱。我的拙见是,您不应该尝试重载^运算符以将其用作电源运算符。我宁愿power在课堂上做一个方法。

于 2012-11-15T17:45:37.360 回答