为什么操作符重载实现中的两个静态对象在c+中总是相等的+;? 我是C++的有效读数。他们举例如下: class Rational{ public : Rational (int num=0, int deno=1); private : int n,d; friend Rational operator*(const Rational &lhs, const Rational &rhs); } Rational& operator*(const Rational& lhs, const Rational& rhs) { static Rational result; result = f(lhs.n*rhs.n, lhs.d*rhs.d) //some function f which multiply num //and denom which returns Rational type return result; } bool operator==(const Rational& lhs, const Rational& rhs); int main() { Rational a,b,c,d; ..... if((a*b)==(c*d)){ .... } else { ..... } }
为什么比较(a*b)=(c*d)总是计算为true ==运算符的计算方式如下(运算符==(运算符*(a,b),运算符*(c,d)))为什么操作符重载实现中的两个静态对象在c+中总是相等的+;? 我是C++的有效读数。他们举例如下: class Rational{ public : Rational (int num=0, int deno=1); private : int n,d; friend Rational operator*(const Rational &lhs, const Rational &rhs); } Rational& operator*(const Rational& lhs, const Rational& rhs) { static Rational result; result = f(lhs.n*rhs.n, lhs.d*rhs.d) //some function f which multiply num //and denom which returns Rational type return result; } bool operator==(const Rational& lhs, const Rational& rhs); int main() { Rational a,b,c,d; ..... if((a*b)==(c*d)){ .... } else { ..... } },c++,object,static,C++,Object,Static,为什么比较(a*b)=(c*d)总是计算为true ==运算符的计算方式如下(运算符==(运算符*(a,b),运算符*(c,d))) 有效的C++表示,将要求运算符==将运算符内的静态Rational对象的值与*运算符内的静态Rational对象的值进行比较。为什么这些静态值总是相等?此比较中的两个表达式((a*b)==(c*d))返回对同一对象的引用-静态理性结果来自内部操作符*。它具有静态存储持续时间,并且从执行流第一次到达它的那一刻起一直存在,直到程序退出(换句话说,它在调用操作符*之间持
有效的C++表示,将要求运算符==将运算符内的静态Rational对象的值与*运算符内的静态Rational对象的值进行比较。为什么这些静态值总是相等?此比较中的两个表达式
((a*b)==(c*d))
返回对同一对象的引用-静态理性结果
来自内部操作符*
。它具有静态存储持续时间,并且从执行流第一次到达它的那一刻起一直存在,直到程序退出(换句话说,它在调用操作符*
之间持续存在)
除非
操作符==
做了一些奇怪的事情,否则一个对象应该等于它自己,结果总是真的。当操作符*返回对同一静态对象的引用时,操作符==只是将这个对象与它自己进行比较。因此,始终返回true。因为函数中的静态变量对于该函数的所有调用都是唯一的。这意味着调用函数的时间或对象(对于成员函数)无关紧要,静态变量将是唯一的,并在调用之间保持其值(而局部变量将在函数的开始和结束时分别构造和销毁)
在您的情况下,将发生以下情况:
- 首先,调用
和操作符*(a,b)
操作符*(c,d)
- 在每次调用中,静态变量的值将被更新,因此唯一的变量将在比较之前更新两次(这很重要)
- 然后,运算符比较两个调用返回的值,这是对静态变量的引用(最后是该变量与自身的比较)
返回true
;)您的标题显示了您的困惑。没有两个静态对象,只有一个。这就是静态的含义。@jrok暂时删除了它,但是调用顺序不应该遵循=
关联性吗?无论如何,它不会改变结果(但值得指出,谢谢),关联性并不一定意味着计算的顺序。它意味着,例如左关联运算符,a==b==c
与(a==b)==c
相同,而不是a==(b==c)
。