Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么操作符重载实现中的两个静态对象在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 - Fatal编程技术网

为什么操作符重载实现中的两个静态对象在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+中总是相等的+;? 我是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))返回对同一对象的引用-静态理性结果来自内部操作符*。它具有静态存储持续时间,并且从执行流第一次到达它的那一刻起一直存在,直到程序退出(换句话说,它在调用操作符*之间持

为什么比较(a*b)=(c*d)总是计算为true

==运算符的计算方式如下(运算符==(运算符*(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)