请教高手指点关于《c++沉思录》第十五章《序列》一个比较困惑的问题
在《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类型没有定义!=运算符!!!
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类型没有定义!=运算符!!!
...全文
相关推荐
C++ 沉思录随书实例源代码
内容索引:VC/C++源码,随书源码,随书源码 C++ 沉思录随书实例源代码,运行于C++环境,都是些小程序,C++打基础的用户学习学习。
c++序列比较大小和降序输出.cpp
c++序列比较大小和降序输出.cpp
c++语言写最长公共子序列问题
用c++语言写的最长公共子序列问题,比较经典的动态规划问题。能完美运行,输入2个字符串序列之后就能得出最长公共子序列。
c++版yaml库yaml-cpp
c++版yaml库yaml-cpp
最长公共子序列问题 动态规划法.cpp.rar
C++的课程作业,一个简单的程序,用dev就能直接运行,老师应该不会太仔细检查,糊弄一下肯定没事的,不过最好能自己看懂就是了


