C++中默认三路比较运算符如何比较对象?以Rational类为例
C++默认<=>运算符的比较逻辑详解
核心结论
默认生成的operator<=>会按照类中数据成员的声明顺序,以字典序依次比较所有非静态数据成员:
- 先比较第一个成员,若两者不等,直接得出整体比较结果,不再比较后续成员;
- 只有当前面的成员全部相等时,才会继续比较下一个成员。
针对你的代码示例分析
你的Rational类中,数据成员声明顺序是numerator在前,denominator在后。
看你创建的两个实例:
Rational rt1{-3, 2}; Rational rt2{3, -2};
- 首先比较
rt1.numerator和rt2.numerator:-3 < 3,两者不相等; - 此时直接判定
rt1 < rt2的结果为true,不会再去比较denominator的值。
额外提醒(针对Rational类的实际问题)
从数学角度看,-3/2和3/-2是相等的,但默认比较会认为它们是不同的对象。如果你的Rational类需要符合数学意义的比较,不能用默认的operator<=>,必须自己实现比较逻辑:比如先将分数约分,统一分母为正数,再比较分子。
内容的提问来源于stack exchange,提问作者a_floating_point
相关产品推荐
相关产品推荐

