您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 程序设计教程(机械工业出版社)课后习题答案--第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(hourt.hour)returntrue;elseif(hour==t.hour&&minutet.minute)returntrue;elseif(hour==t.hour&&minute==t.minute&&secondt.second)returntrue;elsereturnfalse;}booloperator=(Time&t){return*thist||*this==t;}booloperator(Time&t){return!(*this=t);}booloperator=(Time&t){return!(*thist);}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(second0){second+=60;minute--;}while(minute0){minute+=60;hour--;}while(hour0)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()c2.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{coutErrorinoperation/ofComplexendl;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);int
本文标题:程序设计教程(机械工业出版社)课后习题答案--第7章-操作符重载
链接地址:https://www.777doc.com/doc-4662197 .html