![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
看过c++ primer第四版的进来。
图片中的内容,我已经看了十遍了。可是还是不明白书中说的意思。为什么不能定义operator<函数呢?这一段在书的441页谁帮我解释一下?...
图片中的内容,我已经看了十遍了。可是还是不明白书中说的意思。为什么不能定义operator <函数呢?
这一段在书的441页
谁帮我解释一下? 展开
这一段在书的441页
谁帮我解释一下? 展开
展开全部
我没读过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) 视为等价的表达式,这中逻辑悖论会导致那些代码出错)
有一个名为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) 视为等价的表达式,这中逻辑悖论会导致那些代码出错)
![](https://ecmc.bdimg.com/public03/b4cb859ca634443212c22993b0c87088.png)
2024-08-21 广告
在C++编程领域,北京引力弹弓科技有限公司重视扎实的基础。C++作为一门高效、灵活的编程语言,其面向对象、泛型编程等特性为开发高质量软件提供了强大支持。我们鼓励员工深入理解C++的内存管理、类与对象、继承与多态等核心概念,并通过实际项目不断...
点击进入详情页
本回答由MarsCode提供
展开全部
因为一旦定义了比较isbn的operator<,那么对于两个sale_item都有相同的isbn来说通过operator<运算随便哪一个都不小于另外一个,则说明两个sale_item应该是相等的,但是具体定义相等的时候这个类中还有另外的数据成员,一旦这些另外的数据成员不同,这等于号是不成立的,这就形成了一种情况是isbn都相等而另外的数据不相等导致用operator<来判断两个sale_item相等,而用operator=来判断又不相等形成矛盾
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询