请教高手指点关于《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类型没有定义!=运算符!!!