我目前正在将MATLAB代码重写为C ++代码。仅通过键入“ a ^ b”就能将“ a”提升为“ b”的能力,这将使我的生活变得更加轻松,因为这是用MATLAB编写的原始代码。
有没有办法做到这一点? (我正在使用原始类型)
我很乐意接受一个不涉及括号和逗号的解决方案,例如pow(a,b)方法。
谢谢。
#include <iostream>
#include <cmath>
#include <ctgmath>
using namespace std;
class Number {
private:
float _num;
public:
Number(float num) : _num(num){}
Number operator^(const float& num) {
return Number(pow(_num,num));
}
float get() {
return _num;
}
};
int main() {
Number a = Number(5);
Number b = a^7;
cout << b.get();
}
^
以进行幂运算,但您不应该。这是个坏主意。@ AaronF的答案显示了执行此操作的代码有多么丑陋,but
只是冰山一角。当您尝试在实际代码中实际使用real问题时,就会出现此问题。问题源于一个简单的事实:重载运算符会更改该运算符执行的操作,但not不会影响该运算符的优先级或关联性。在^
的情况下,两个优先级和关联性对于幂运算都是完全错误的。优先级
^
运算符的优先级很低。求幂应该具有很高的优先级。例如,如果我有一个类似x^y*z
的表达式,我会(x^y)*z
,但是在C ++中它的真正含义是x^(y*z)
。实际上,在C ++中,^
的优先级甚至低于加法和减法,因此x^y+z
出现错误-这意味着x^(y+z)
而不是您想要的(x^y)+z
。关联性
幂运算是右关联的-但是在C ++中,^
运算符是左关联的。例如,给定类似x^y^z
的表达式,您要x^(y^z)
,但得到的却是(x^y)^z
。结果
这意味着,如果您重载operator^
进行幂运算,您将仅能使用名称pow
。您将operator^
的优先级和关联性对于取幂都是完全错误的。结论
尽管您operator^
做幂运算,但这是那些谨慎决定勇气最好的地方之一。在C ++中重载运算符时,确实要考虑三个因素:名称,优先级和关联性。为了使操作员很好地过载,所有这三个都应该正确。有时在三分之二正确的情况下进行过载是很合理的,而第三分之差也不算太远。在这种情况下,只有三分之二甚至接近正确;其他两个错误是[[completely错误。不要这样做。这是个坏主意。
pow()在cmath库中。有关更多信息