程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx
- 文档编号:17251598
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:51
- 大小:31.65KB
程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx
《程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx》由会员分享,可在线阅读,更多相关《程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx(51页珍藏版)》请在冰点文库上搜索。
程序设计教程机械工业出版社课后习题答案第7章操作符重载
第7章操作符重载
1、为什么要对操作符进行重载?
是否所有的操作符都可以重载?
答:
通过对C++操作符进行重载,我们可以实现用C++的操作符按照通常的习惯来对某些类(特别是一些数学类)的对象进行操作,从而使得程序更容易理解。
除此之外,操作符重
载机制也提高了C++语言的灵活性和可扩充性,它使得C++操作符除了能对基本数据类型和构造数据类型进行操作外,也能用它们来对类的对象进行操作。
不是所有的操作符都可以重载,因为“.”,“.*”,“:
:
”,“?
:
”,sizeof这五个操作符不能重载。
2、操作符重载的形式有哪两种形式?
这两种形式有什么区别?
答:
一种就是作为成员函数重载操作符;另一种就是作为全局(友元)函数重载操作符。
当操作符作为类的非静态成员函数来重载时,由于成员函数已经有一个隐藏的参数this,因此对于双目操作符重载函数只需要提供一个参数,对于单目操作符重载函数则不需
提供参数。
当操作符作为全局函数来重载时,操作符重载函数的参数类型至少有一个为类、结构、
枚举或它们的引用类型。
而且如果要访问参数类的私有成员,还需要把该函数说明成相应类
的友元。
对于双目操作符重载函数需要两个参数,对于单目操作符重载函数则需要给出一个参数。
操作符=、()、[]以及->不能作为全局函数来重载。
另外,作为类成员函数来重载时,操作符的第一个操作数必须是类的对象,全局函数重载则否。
3、定义一个时间类Time,通过操作符重载实现:
时间的比较(==、!
=、>、>=、<、<=)、时间增加/减少若干秒(+=、-=)、时间增加/减少一秒(++、--)以及两个时间相差的秒数(-)。
解:
classTime
{
private:
inthour,minute,second;
public:
Time()
{hour=minute=second=0;
}
Time(inth)
{hour=h;minute=second=0;
}
Time(inth,intm)
{hour=h;
minute=m;
second=0;
}
Time(inth,intm,ints)
{hour=h;
minute=m;
second=s;
}
Time(constTime&t)
{hour=t.hour;
minute=t.minute;
second=t.second;
}
booloperator==(Time&t)
{if(hour==t.hour&&minute==t.minute&&second==t.second)
returntrue;
returnfalse;
}
booloperator!
=(Time&t)
{return!
(*this==t);
}
booloperator>(Time&t)
{if(hour>t.hour)returntrue;
elseif(hour==t.hour&&minute>t.minute)
returntrue;
elseif(hour==t.hour&&minute==t.minute&&second>t.second)
returntrue;
else
returnfalse;
}
booloperator>=(Time&t)
{return*this>t||*this==t;
}
booloperator<(Time&t)
{return!
(*this>=t);
}
booloperator<=(Time&t)
{return!
(*this>t);
}
Time&operator+=(ints)
{second+=s;
while(second>=60)
{second-=60;
minute++;
}
while(minute>=60)
{minute-=60;hour++;
}
while(hour>=24)
hour-=24;
return*this;
}
Time&operator-=(ints)
{second-=s;
while(second<0)
{second+=60;minute--;
}
while(minute<0)
{minute+=60;hour--;
}
while(hour<0)
hour+=24;
return*this;
}
Time&operator++()//对Timet,操作为:
++t
{*this+=1;return*this;
}
Timeoperator++(int)
//
对Timet
,操作为:
t++
{Timet=*this;
*this+=1;
returnt;
}
Time&operator--()
{*this-=1;return*this;
}
Timeoperator--(int)
{Timet=*this;*this-=1;
returnt;
}
intoperator-(Time&t)
{//把时间直接换算成秒数计算
intsec1=hour*3600+minute*60+second;
intsec2=t.hour*3600+t.minute*60+t.second;
returnsec2-sec1;
}
};
4、利用操作符重载给出一个完整的复数类的定义。
解:
classComplex
{
private:
doublereal,imag;
public:
Complex()
{real=imag=0;
}
Complex(doubler)
{real=r;imag=0;
}
Complex(doubler,doublei)
{real=r;imag=i;
}
Complex(constComplex&c)
{real=c.real;
imag=c.imag;
}
doublemodulus()const
{returnreal*real+imag*imag;
}
Complexoperator-()const
{Complextemp;temp.real=-real;temp.imag=-imag;
returntemp;
}
friendbooloperator==(constComplex&c1,constComplex&c2);
friendbooloperator!
=(constComplex&c1,constComplex&c2);
friendbooloperator>(constComplex&c1,constComplex&c2);
friendbooloperator>=(constComplex&c1,constComplex&c2);
friendbooloperator<(constComplex&c1,constComplex&c2);
friendbooloperator<=(constComplex&c1,constComplex&c2);
friendComplexoperator+(constComplex&c1,constComplex&c2);
friendComplexoperator-(constComplex&c1,constComplex&c2);
friendComplexoperator*(constComplex&c1,constComplex&c2);
friendComplexoperator/(constComplex&c1,constComplex&c2);
};
booloperator==(constComplex&c1,constComplex&c2)
{return(c1.real==c2.real)&&(c1.imag==c2.imag);
}
booloperator!
=(constComplex&c1,constComplex&c2)
{return!
(c1==c2);
}
booloperator>(constComplex&c1,constComplex&c2)
{returnc1.modulus()>c2.modulus();
}
booloperator>=(constComplex&c1,constComplex&c2)
{returnc1.modulus()>=c2.modulus();
}
booloperator<(constComplex&c1,constComplex&c2)
{returnc1.modulus() } booloperator<=(constComplex&c1,constComplex&c2) {returnc1.modulus()<=c2.modulus(); } Complexoperator+(constComplex&c1,constComplex&c2) {Complextemp; temp.real=c1.real+c2.real; temp.imag=c1.imag+c2.imag; returntemp; } Complexoperator-(constComplex&c1,constComplex&c2) {Complextemp;temp.real=c1.real-c2.real;temp.imag=c1.imag-c2.imag;returntemp; } Complexoperator*(constComplex&c1,constComplex&c2) {Complextemp; temp.real=c1.real*c2.real-c1.imag*c2.imag; temp.imag=c1.real*c2.imag+c1.imag*c2.real; returntemp; } Complexoperator/(constComplex&c1,constComplex&c2) {doubled=c2.modulus();if(d! =0) {Complextemp;temp.real=(c1.real*c2.real+c1.imag*c2.imag)/d;temp.imag=(c1.imag*c2.real-c1.real*c2.imag)/d;returntemp; } else {cout<<"Errorinoperation/ofComplex"< exit(-1); } } 5、定义一个多项式类Polynomial,其实例为多项式: a0+a1x+a2x2+...+anxn,该类具有如下 的接口: classPolynomial {...... public: Polynomial(); Polynomial(doublecoefs[],intexps[],intsize); //系数数组、指数数组和项数 Polynomial(constPolynomial&); ~Polynomial(); Polynomial&operator=(constPolynomial&); intdegree()const;//最高幂指数 doubleevaluate(doublex)const;//计算多项式的值 booloperator==(constPolynomial&)const; booloperator! =(constPolynomial&)const; Polynomialoperator+(constPolynomial&)const; Polynomialoperator-(constPolynomial&)const; Polynomialoperator*(constPolynomial&)const; Polynomial&operator+=(constPolynomial&); Polynomial&operator-=(constPolynomial&); Polynomial&operator*=(constPolynomial&); }; 解: classPolynomial {double*pcoefs; int*pexps; intnum_of_items; intadd(constPolynomial&p,double*coefs,int*exps)const; intsubtract(constPolynomial&p,double*coefs,int*exps)const; public: Polynomial(); Polynomial(doublecoefs[],intexps[],intsize); Polynomial(constPolynomial&p); ~Polynomial(); Polynomial&operator=(constPolynomial&p); intdegree()const; doubleevaluate(doublex)const; booloperator==(constPolynomial&p)const; booloperator! =(constPolynomial&p)const; Polynomialoperator+(constPolynomial&p)const; Polynomialoperator-(constPolynomial&p)const; Polynomialoperator*(constPolynomial&p)const; Polynomial&operator+=(constPolynomial&p); Polynomial&operator-=(constPolynomial&p); Polynomial&operator*=(constPolynomial&p); }; intPolynomial: : add(constPolynomial&p,double*coefs,int*exps)const {intcount=0,i=0,j=0; while(i {if(pcoefs[i]! =-p.pcoefs[j]) {coefs[count]=pcoefs[i]+p.pcoefs[j];exps[count]=pexps[i]; count++; } i++;j++; } elseif(pexps[i] {coefs[count]=pcoefs[i]; exps[count]=pexps[i]; count++;i++; } else {coefs[count]=p.pcoefs[j];exps[count]=p.pexps[j]; count++;j++; } } if(i while(i {coefs[count]=pcoefs[i]; exps[count]=pexps[i]; count++;i++; } else while(j {coefs[count]=p.pcoefs[j]; exps[count]=p.pexps[j]; count++;j++; } returncount; } intPolynomial: : subtract(const Polynomial &p,double *coefs, int *exps) const {intcount=0,i=0,j=0; while(i {if(pexps[i]==p.pexps[j]){if(pcoefs[i]! =p.pcoefs[j]) {coefs[count]=pcoefs[i]-p.pcoefs[j];exps[count]=pexps[i]; count++; } i++;j++; } elseif(pexps[i] {coefs[count]=pcoefs[i];exps[count]=pexps[i]; count++;i++; } else {coefs[count]=-p.pcoefs[j];exps[count]=p.pexps[j];count++;j++; } } if(i while(i {coefs[count]=pcoefs[i]; exps[count]=pexps[i];count++;i++; } else while(j {coefs[count]=-p.pcoefs[j]; exps[count]=p.pexps[j]; count++;j++; } returncount; } Polynomial: : Polynomial() {pcoefs=NULL; pexps=NULL; num_of_items=0; } Polynomial: : Polynomial(doublecoefs[],intexps[],intsize) {num_of_items=size; pcoefs=newdouble[num_of_items]; pexps=newint[num_of_items]; inti; for(i=0;i {pcoefs[i]=coefs[i];pexps[i]=exps[i]; } //按指数排序(冒泡排序) for(i=num_of_items;i>1;i--) {boolexchange=false;for(intj=1;j {if(pexps[j] {//交换pexps[j]和pexps[j-1] inttemp1=pexps[j]; pexps[j]=pexps[j-1]; pexps[j-1]=temp1; //交换pcoefs[j]和pcoefs[j-1] doubletemp2=pcoefs[j]; pcoefs[j]=pcoefs[j-1]; pcoefs[j-1]=temp2; exchange=true; } } if(! exchange)break; } } Polynomial: : Polynomial(constPolynomial&p) {num_of_items=p.num_of_items; pcoefs=newdouble[num_of_items];pexps=newint[num_of_items]; for(inti=0;i {pcoefs[i]=p.pcoefs[i];pexps[i]=p.pexps[i]; } } Polynomial: : ~Polynomial() {delete[]pcoefs;delete[]pexps; pcoefs=NULL; pexps=NULL; num_of_items=0; } Polynomial&Polynomial: : operator=(constPolynomial&p) {delete[]pcoefs; delete[]pexps; num_of_items=p.num_of_items; pcoefs=newdouble[num_of_items]; pexps=newint[num_of_items];for(inti=0;i pexps[i]=p.pexps[i]; } return*this; } intPolynomial: : degree()const {if(num_of_items==0)return0; else returnpexps[num_of_items-1]; } doublePolynomial: : evaluate(doublex)const {doublesum=0; for(inti=0;i {doubletemp=pcoefs[i]; for(intj=0;j temp*=x; sum+=temp; } returnsum; } boolPolynomial: : operator==(constPolynomial&p)const {if(num_of_items! =p.num_of_items)returnfalse;for(inti=0;i if(pcoefs[i]! =p.pcoefs[i]||pexps[i]! =p.pexps[i])returnfalse; returnt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 教程 机械工业 出版社 课后 习题 答案 操作 重载
![提示](https://static.bingdoc.com/images/bang_tan.gif)