请教高手指点关于《c++沉思录》第十五章《序列》一个比较困惑的问题

dfjy 2009-11-15 02:11:59
在《c++沉思录》第十五章《序列》中Seq<T>类的比较运算符operator==是这样定义的:
template<class T> bool operator==(const Seq<T>& op1, const Seq<T>& op2)
{
if(op1.length != op2.length)
return false ;
Seq_item<T>* p = op1.item ;
Seq_item<T>* q = op2.item ;

while(p != q)
{
assert (p != 0 && q != 0)
if(*p++ != *q++)
return false ;
}
return true ;
}
在此函数中语句if(*p++ != *q++)的意义是什么用什么来比较?若是Seq_item<T>对象之间的!=比较,则Seq_item<T>没有定义!=运算符,编译错误。若p和q由Seq_item<T>* 隐式转换到类Seq<T>对象(Seq(const Seq_item<T>* s)构造函数),则可以进行!=比较,先执行++后再执行*运算符(Seq<T>类有定义*和++运算符,*返回类型T,++返回类型Seq<T>),执行*p++和*q++表达式后的值是T类型,可以比较,副作用是p和q被转换成Seq<T>类型并指向“下一个”Seq<T>对象,若比较为true,回到while(p != q)语句,但在此while语句中p不能同q作!=比较,因为p和q已转换成Seq类型,而Seq类型没有定义!=运算符!!!
...全文
110 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yshuise 2009-12-01
  • 打赏
  • 举报
回复
if(*p++ != *q++)
============
这种形式一般就是元素T类型,而不是成员函数operator !=
waver_1111 2009-11-30
  • 打赏
  • 举报
回复
这个应该这样理解,如果两个容器相等,就说明引用的底层数据结构是相同的,所以作者的意思就是指针的操作,不存在转化的问题,大家都想的太复杂了,就是说底层应该是同一个链表才对,所以只要比对地址就好
bean11222 2009-11-15
  • 打赏
  • 举报
回复
while(p != q) 只是对地址空间里的地址值进行的比较~p和q不能指象一个地方 也就是地址值不能相同~
dfjy 2009-11-15
  • 打赏
  • 举报
回复
回复楼上,分析了很久,搞懂了大部分,但最后一步 不明白。这里写出来让有兴趣的研究指正,要明白这个问题首先要清楚其背景,请参考《c++沉思录》第十五章序列中关于Seq和Seq_item类的定义。
在语句if(*p++ != *q++)语句中因为*p和*q是Seq_item<T>类对象,而Seq_item<T>类没有定义!=操作,
也没有定义++操作(注意:Seq_item<T>是链表的节点类型,不是顺序数组那样可用内置的++操作指针以指向下一个元素)。所以p和q只有由Seq_item<T>*类型通过Seq<T>的构造函数
Seq<T>(const Seq_item<T>*s)隐式转换成Seq<T>类型,(此隐式转换应该是由系统自动生成值等于p和q的
临时变量tp和tq进行转换,转换成Seq<T>类型的tp和tq再进行*和++操作,之后再进行!=操作,因为Seq<T>类重定义了*和++操作,*操作返回T类型(T类型一般都内置了或定义了!=操作),故可以进行!=操作。

而临时变量tp和tq执行++操作后,tp和tq返回“指向下一个链表节点”的Seq<T>搞不懂的地方就在这:由Seq<T>(const Seq_item<T>* s)构造函数和template<class T> Seq<T> Seq<T>::operator++(int)的定义知道这个临时变量的操作的结果不会反映到p和q上,即p和q在tp和tq执行++操作后p和q不会指向下一个链表节点”,这样就不能遍历op1和op2的节点。搞不明白啊

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧