我正在阅读 effective 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) 总是计算为真?
== 运算符将被计算为 if(operator==(operator*(a,b),operator*(c,d))) Effective C++ 表示 - 运算符 == 将被要求将运算符 * 内的静态 Rational 对象的值与 * 运算符内的静态 Rational 对象的值进行比较。为什么这些静态值总是相等的?
最佳答案
此比较中的两个表达式 ((a*b)==(c*d))
从内部返回对同一对象的引用 - static Rational result
运算符*
。它具有静态存储持续时间,从执行流第一次到达它的那一刻起一直存在,直到程序退出(换句话说,它在对 operator*
的调用之间持续存在)。
除非 operator==
做了一些奇怪的事情,否则一个对象应该等于它自己并且结果永远为真。
关于c++ - 为什么运算符重载实现中的两个静态对象在 C++ 中总是相等的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19094418/