为什么运算符重载实现中的两个 Static 对象在 c++ 中始终相等
Why two Static object inside an operator overload implementation will always be equal in 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?
== 运算符的计算结果为 if(operator==(operator*(a,b),operator*(c,d)))有效C++说 - 将要求运算符 == 将运算符 * 中的静态 Rational 对象的值与 * 运算符内的静态 Rational 对象的值进行比较。为什么这些静态值将始终相等?
此比较中的两个表达式((a*b)==(c*d))
返回对同一对象的引用 - 从operator*
内部static Rational result
。它具有静态存储持续时间,从执行流第一次到达它的那一刻起,直到程序退出(换句话说,它在调用operator*
之间持续存在)。
除非operator==
做了一些奇怪的事情,否则一个对象应该等于它自己,结果将永远是真的。
因为函数中的静态变量对于此函数的所有调用都是唯一的。这意味着何时或在哪个对象(对于成员函数)上调用函数并不重要,静态变量将是唯一的,并在调用之间保持其值(而局部变量将分别在函数的开头和结尾构造和销毁。
在您的情况下,这将发生:
- 首先,
operator*(a,b)
和operator*(c,d)
都被称为 - 在每次调用中,静态变量的值都会更新,因此唯一的变量将在比较之前更新两次(这很重要)
- 然后,运算符比较两个调用返回的值,这是对静态变量的引用(最终是该变量与自身的比较)
由于运算符*返回对同一静态对象的引用,operator== 只是将此对象与自身进行比较。因此,始终返回 true。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- static是如何使用ClassA::m_variable处理所有类对象的
- 在C++中传递对象会产生'invalid use of non-static member'错误
- 只为NOT STATIC类的EACH对象调用一次方法
- 在C++中,"static initialization fiasco"是否仅影响对另一个模块中定义的对象的数据成员的引用?
- 为什么运算符重载实现中的两个 Static 对象在 c++ 中始终相等
- static const转换为c++共享库中的对象.是进程间共享的吗?
- 使用 "static virtual" 函数的元对象
- 将std::mutex设为static会为互斥对象本身创建竞争条件
- "static"关键字与类的变量、函数和对象等有什么用?