看过c++ primer第四版的进来。

图片中的内容,我已经看了十遍了。可是还是不明白书中说的意思。为什么不能定义operator<函数呢?这一段在书的441页谁帮我解释一下?... 图片中的内容,我已经看了十遍了。可是还是不明白书中说的意思。为什么不能定义operator <函数呢?
这一段在书的441页
谁帮我解释一下?
展开
 我来答
starfar1983
2010-12-06 · TA获得超过2258个赞
知道小有建树答主
回答量:692
采纳率:0%
帮助的人:1039万
展开全部
我没读过C++ PRIMER第四版,不过这段话的意思倒是很明显:
有一个名为Sales_item的class或者struct,里面至少包含了两个成员:ISBN和销售数据。
现在想为它重载操作符<和==。
==操作符只有在ISBN和销售数据都相等的时候,才会返回true。
如果想让Sales_item可以做为std::map(也就是所谓的关联容器)的key值,就必须为Sales_item提供一个比较方法,这样才能实现对Sales_item的排序。那么有两种办法:

1. 为sales_item定义一个functor。具体做法参考第15章。

2. 为Sales_item定义<操作符。但是这样会引发逻辑悖论。假设有两个整数a和b,判断他们是否相等,有两个等价的办法:a==b 或者 !(a<b || b<a) 。这两个表达式的值一定是相等的!后面这种办法虽然看起来很麻烦,但是在STL里很多情况都是用这种办法来判断两个对象是否相等的。

关键的地方来了:因为Sales_item希望只按照ISBN排序,所以在为Sales_item定义<操作符时,要忽略掉销售数据。现在假设有两个对象a和b,他们的ISBN相等,销售数据不同,那么会发生这样的悖论:
a < b ---- false (a不小于b,因为他们ISBN相同)
b < a ---- false (b不小于a,因为他们ISBN相同)
所以!(a<b || b<a)的值是true。
a == b ---- false! (但是之前定义==操作符的时候,还比较了销售数据,所以a==b也不能成立!这跟!(a<b || b<a)的值不一样了!STL里有些代码会把a==b 和 !(a<b || b<a) 视为等价的表达式,这中逻辑悖论会导致那些代码出错)
jdg8888
2010-12-06
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
因为一旦定义了比较isbn的operator<,那么对于两个sale_item都有相同的isbn来说通过operator<运算随便哪一个都不小于另外一个,则说明两个sale_item应该是相等的,但是具体定义相等的时候这个类中还有另外的数据成员,一旦这些另外的数据成员不同,这等于号是不成立的,这就形成了一种情况是isbn都相等而另外的数据不相等导致用operator<来判断两个sale_item相等,而用operator=来判断又不相等形成矛盾
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式