程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx

上传人:b****6 文档编号:4019886 上传时间:2022-11-27 格式:DOCX 页数:43 大小:23.72KB
下载 相关 举报
程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx_第1页
第1页 / 共43页
程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx_第2页
第2页 / 共43页
程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx_第3页
第3页 / 共43页
程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx_第4页
第4页 / 共43页
程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx

《程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx》由会员分享,可在线阅读,更多相关《程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx(43页珍藏版)》请在冰豆网上搜索。

程序设计教程机械工业出版社课后习题答案第7章操作符重载.docx

程序设计教程机械工业出版社课后习题答案第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;

returntr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1