您好,欢迎访问三七文档
习题7及其解答7.1选择题1.在下列运算符中,不能重载的是(b)。(a)!(b)sizeof(c)new(d)delete2.下列关于运算符重载的描述中,(d)是正确的。(a)可以改变参与运算的操作数个数(b)可以改变运算符原来的优先级(c)可以改变运算符原来的结合性(d)不能改变原运算符的语义3.下列函数中,不能重载运算符的函数是(b)。(a)成员函数(b)构造函数(c)普通函数(d)友员函数4.要求用成员函数重载的运算符是(a)。(a)=(b)==(c)=(d)++5.要求用友员函数重载的运算符是(c)。(a)=(b)[](c)(d)()6.下面关于类型转换的描述中,错误的是(a)。(a)任何形式的构造函数都可以实现数据类型转换。(b)带非默认参数的构造函数可以把基本类型数据转换成类类型对象。(c)类型转换函数可以把类类型对象转换为其他指定类型对象。(d)类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数。7.2阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;classT{public:T(){a=0;b=0;c=0;}T(inti,intj,intk){a=i;b=j;c=k;}voidget(int&i,int&j,int&k){i=a;j=b;k=c;}Toperator*(Tobj);private:inta,b,c;};TT::operator*(Tobj){Ttempobj;tempobj.a=a*obj.a;tempobj.b=b*obj.b;tempobj.c=c*obj.c;returntempobj;}intmain(){Tobj1(1,2,3),obj2(5,5,5),obj3;inta,b,c;obj3=obj1*obj2;obj3.get(a,b,c);cout(obj1*obj2):a=a'\t'b=b'\t'c=c'\t'endl;(obj2*obj3).get(a,b,c);cout(obj2*obj3):a=a'\t'b=b'\t'c=c'\t'endl;}【解答】(obj1*obj2):a=5b=10c=15(obj2*obj3):a=25b=50c=752.#includeiostreamusingnamespacestd;classVector{public:Vector(){}Vector(inti,intj){x=i;y=j;}friendVectoroperator+(Vectorv1,Vectorv2){VectortempVector;tempVector.x=v1.x+v2.x;tempVector.y=v1.y+v2.y;returntempVector;}voiddisplay(){cout(x,y)endl;}private:intx,y;};intmain(){Vectorv1(1,2),v2(3,4),v3;coutv1=;v1.display();coutv2=;v2.display();v3=v1+v2;coutv3=v1+v2=;v3.display();}【解答】v1=(1,2)v2=(3,4)v3=v1+v2=(4,6)7.3思考题1.一个运算符重载函数被定义为成员函数或友员函数,从定义方式、解释方式和调用方式上有何区别?可能会出现什么问题?请用一个实例说明之。【解答】以二元运算符为例。运算符重载定义解释调用成员函数Obj&operatorop();Objoperatorop(object);Obj.operatorop()ObjL.operatorop(ObjR)Objop或opObjObjLopObjR左操作数通过this指针指定,右操作数由参数传递友员函数friendObj&operatorop(Obj&);friendObjoperatorop(Obj,Obj);operatorop(Obj)operatorop(ObjL,ObjR)Objop或opObjObjLopObjR操作数均由参数传递可能会出现的问题:(1)运算符的左右操作数不同,须用友员函数重载;(2)当运算符的操作需要修改类对象状态时,应用成员函数重载。(3)友员函数不能重载运算符=()[]-必须要用友员函数重载的运算符程序略。2.类类型对象之间,类类型和基本类型对象之间用什么函数进行类型转换?归纳进行类型转换的构造函数和类型转换函数的定义形式、调用形式和调用时机。【解答】构造函数可以把基本类型、类类型数据转换成类类型数据;类类型转换函数可以在类类型和基本数据类型之间做数据转换。定义形式调用形式调用时机构造函数ClassX::ClassX(arg,arg1=E1,...,argn=En);隐式调用建立对象、参数传递时类类型转换函数ClassX::operatorType();用类型符显式调用;自动类型转换时隐式调用需要做数据类型转换时7.4编程题1.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。【解答】(1)使用成员函数#includeiostream#includecstringusingnamespacestd;classs{public:s(){*str='\0';}s(char*pstr){strcpy(str,pstr);}char*gets(){returnstr;}soperator+(sobj);private:charstr[10];};ss::operator+(sobj){strcat(str,obj.str);returnstr;//或return*this}intmain(){sobj1(Visual),obj2(C++),obj3;obj3=obj1+obj2;coutobj3.gets()endl;}(2)使用友员函数#includeiostream#includecstringusingnamespacestd;classs{public:s(){*str='\0';}s(char*pstr){strcpy(str,pstr);}char*gets(){returnstr;}friendsoperator+(sobj1,sobj2);private:charstr[100];};soperator+(sobj1,sobj2){stempobj;strcat(tempobj.str,obj1.str);strcat(tempobj.str,obj2.str);returntempobj;}intmain(){sobj1(Visual),obj2(C++),obj3;obj3=obj1+obj2;coutobj3.gets()endl;}2.定义一个整数计算类Integer,实现短整数+,-,*,/基本算术运算。要求可以进行数据范围检查(-32768~32767,或自行设定),数据溢出时显示错误信息并中断程序运行。【解答】#includeiostreamusingnamespacestd;classInteger{private:shorta;public:Integer(shortn=0){a=n;}Integeroperator+(Integer);Integeroperator-(Integer);Integeroperator*(Integer);Integeroperator/(Integer);Integeroperator=(Integer);voiddisplay(){coutaendl;}};IntegerInteger::operator+(Integerx){Integertemp;if(a+x.a-32768||a+x.a32767){coutDataoverflow!endl;abort();}temp.a=a+x.a;returntemp;}IntegerInteger::operator-(Integerx){Integertemp;if(a-x.a-32768||a-x.a32767){coutDataoverflow!endl;abort();}temp.a=a-x.a;returntemp;}IntegerInteger::operator*(Integerx){Integertemp;if(a*x.a-32768||a*x.a32767){coutDataoverflow!endl;abort();}temp.a=a*x.a;returntemp;}IntegerInteger::operator/(Integerx){Integertemp;if(a/x.a-32768||a/x.a32767){coutDataoverflow!endl;abort();}temp.a=a/x.a;returntemp;}IntegerInteger::operator=(Integerx){a=x.a;return*this;}intmain(){IntegerA(90),B(30),C;coutA=;A.display();coutB=;B.display();C=A+B;coutC=A+B=;C.display();C=A-B;coutC=A-B=;C.display();C=A*B;coutC=A*B=;C.display();C=A/B;coutC=A/B=;C.display();}3.定义一个实数计算类Real,实现单精度浮点数+,-,*,/基本算术运算。要求可以进行数据范围(-3.4×1038~3.4×1038,或自行设定)检查,数据溢出时显示错误信息并中断程序运行。【解答】#includeiostreamusingnamespacestd;classReal{private:doublea;public:Real(doubler=0){a=r;}Realoperator+(Real);Realoperator-(Real);Realoperator*(Real);Realoperator/(Real);Realoperator=(Real);voiddisplay(){coutaendl;}};RealReal::operator+(Realx){Realtemp;if(a+x.a-1.7e308||a+x.a1.7e308){coutDataoverflow!endl;abort();}temp.a=a+x.a;returntemp;}RealReal::operator-(Realx){Realtemp;if(a-x.a-1.7e308||a-x.a1.7e308){coutDataoverflow!endl;abort();}temp.a=a-x.a;returntemp;}RealReal::operator*(Realx){Realtemp;if(a*x.a-1.7e308||a*x.a1.7e308){coutDataoverflow!endl;abort();}temp.a=a*x.a;returntemp;}RealReal::operator/(Realx){Realtemp;if(a/x.a-1.7e308||a/x.a1.7e308){coutDataoverflow!endl;abort();}temp.a=a/x.a;returntemp;}RealReal::operator=(Realx){a=x.a;return*this;}intmain(){RealA(1.1),B(1.2),C;coutA=;A.display();coutB=;B
本文标题:习题7及其解答
链接地址:https://www.777doc.com/doc-4770523 .html