【问题标题】:Overload power with correctly in c++?在 c++ 中正确地过载电源?
【发布时间】:2012-11-04 09:17:16
【问题描述】:

在 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:向我们展示一些真正有价值的代码。我不是通灵者(没有人是),所以我看不出你对operator^ 的定义是什么。
  • 即使您可以更改关联性(您不能),优先级也会令人困惑; a * b^c 将被解析为 (a*b)^c。通常最好不要重载运算符来执行与内置版本在概念上不同的操作。
  • @user1705796 是的,你真的不想那样做。拥有 '^' 作为权力会让任何习惯使用 '^' 表示 XOR(即,每个 C++ 开发人员)的人感到困惑。此外,“数学上”并没有错。左/右关联性不是数学属性(尽管关联性是 - ^ 顺便说一下不是关联性的,(a^b)^c != a^(b^c)),它只是一个约定。
  • @user1705796:认真的吗?你认为“but Y -ve”是你可以在公共场合输入并期望人们容忍你的东西吗?如果你不能抽出五秒钟来打出一个英文句子,我们为什么要花五分钟来思考你的问题?

标签: c++ operators operator-overloading xor


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 在这种情况下没有不明确的关联或优先级。
  • @user1705796,这是因为关联性在链接运算符之前不会起作用。无论运算符是左结合还是右结合,只使用一次都没有区别。当您连续多次使用它时会出现问题,例如a ^ b ^ c。使用左关联 ^ 运算符,这将变为 (a ^ b) ^ c。使用右关联运算符,它变为a ^ (b ^ c)。这对于幂运算符来说是个问题,因为它是不可交换的:您不能对操作数重新排序并获得相同的结果(例如,对于加法或乘法运算符)。
  • 您总是可以使用波兰语前缀表示法的类,这将解决您的操作问题。
  • @zneak 感谢您的回答我几乎只了解如何重载运算符的作业,但我无法增强语言。非常感谢您的精彩回答!
  • @Need4Sleep:对不起,我听不懂你说什么:(但是谢谢!...你能再补充一条评论吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2017-04-29
  • 2017-07-30
  • 2011-08-12
相关资源
最近更新 更多