作业━━第-5-章(4)━━运算符重载_第1页
作业━━第-5-章(4)━━运算符重载_第2页
作业━━第-5-章(4)━━运算符重载_第3页
作业━━第-5-章(4)━━运算符重载_第4页
作业━━第-5-章(4)━━运算符重载_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE1PAGE1运算符重载【学习要点】1.理解多态性的概念和实现。①编译时多态性是通过函数重载、运算符重载实现的。②运行时多态性是通过类的继承+虚函数实现的。掌握运算符重载的作用和规则。①在C++中可根据需要对运算符赋予多种含义,以配合用户自定义的类类型。②运算符重载是通过定义运算符重载函数operator运算符()实现的。3.掌握双目、单目运算符重载为成员函数的方法。4.掌握双目、单目运算符重载为友元函数的方法。5.掌握重载为成员函数、重载为友元函数的区别:①友元函数与成员函数不同,它不是类的成员,没有this指针。②运算符=、()、[]、—>不能重载为友元函数,只能重载为成员函数。③运算符插入”<<”、提取”>>”只能重载为友元函数。6.掌握几个特殊运算符“++”、“--”、“=”、“[]”、“<<”、“>>”的重载。7.掌握类型转换函数。8.掌握自定义字符串类。9.掌握C++标准库中的string类的使用。【例题分析】1.下面程序中的错误有几处?#include<iostream.h>classC{intx,y;public:C(){}C(inta,intb):x(a),y(b){}Coperator@(Ca){Ctemp;temp.x=x+a.x;temp.y=y+a.y;returntemp;}intoperator#(Ca){return(x*y);}friendCoperator=(Ca){x=a.x;y=b.y;return*this;}voidshow(){cout<<"x="<<x<<"\ty="<<y<<endl;}};voidmain(){Ca(2,3),b(2,3),c;(a+b).show();c=a;c.show();}【答案】3【解析】①函数Coperator@(Ca);运算符重载是允许用户重新定义运算符的含义,但此运算符必须是C++系统预定义的,而“@”不是C++预定义的运算符,应换成“+”。②函数intoperator#(Ca);符号#不允许重载,应换成“*”,另外形参Ca也不需要。③函数friendCoperator=(Ca);赋值运算符“=”只能重载为成员函数,不能重载为友元函数,故将friend删去。其次,返回类型最好是C&。2.编写程序:存放在myVector.cpp文件中,包含内容如下:①定义向量类Vector。私有成员数据有:存放向量在三条坐标轴上投影值的x、y、z。公有成员函数有:可设置向量中x、y、z值的成员函数voidset(floata=0,floatb=0,floatc=0);可输出向量中x、y、z值的成员函数voidshow();构造函数Vector(floata=0,floatb=0,floatc=0);构造函数Vector(floatv[3]);两个赋值运算符“=”重载成员函数Vector&operator=(Vectorv)、Vector&operator=(floatv[3])。②将实现两个向量之间加、减、乘运算的三个独立函数声明为Vector类的友元函数:friendVectoroperator+(Vectorv1,Vectorv2);friendVectoroperator-(Vectorv1,Vectorv2);friendfloatoperator*(Vectorv1,Vectorv2);③编写main()函数去测试,完成向量间的运算。【提示】若向量a在三条坐标轴上的投影为ax,ay,az,则表达式a={ax,ay,az}称为向量a的坐标表达式。设有两个向量a和b,它们之间的加、减、乘的运算公式为:a+b={ax+bx,ay+by,az+bz}a-b={ax-bx,ay-by,az-bz}a*b=ax*bx+ay*by+az*bz将运算符“+”、“-”、“*”和“=”重载,实现向量间的加、减、乘、赋值运算。【答案】编写程序如下:#include<iostream.h>#include<math.h>classVector{floatx,y,z;public:Vector(floata=0,floatb=0,floatc=0){x=a;y=b;z=c;}Vector(floatv[3]){x=v[0];y=v[1];z=v[2];}voidset(floata=0,floatb=0,floatc=0){x=a;y=b;z=c;}voidshow(){cout<<x<<'i';cout<<((y<0)?'-':'+')<<fabs(y)<<'j'

;cout<<((z<0)?'-':'+')<<fabs(z)<<'k'<<endl;}Vector&operator=(Vectorv);Vector&operator=(floatv[3]);friendVectoroperator+(Vectorv1,Vectorv2);friendVectoroperator-(Vectorv1,Vectorv2);friendfloatoperator*(Vectorv1,Vectorv2);};Vector&Vector::operator=(Vectorv){x=v.x;y=v.y;z=v.z;return*this;}Vector&Vector::operator=(floatv[3]){x=v[0];y=v[1];z=v[2];return*this;}Vectoroperator+(Vectorv1,Vectorv2){Vectortemp;temp.x=v1.x+v2.x;temp.y=v1.y+v2.y;temp.z=v1.z+v2.z;returntemp;}Vectoroperator-(Vectorv1,Vectorv2){Vectortemp;temp.x=v1.x-v2.x;temp.y=v1.y-v2.y;temp.z=v1.z-v2.z;returntemp;}floatoperator*(Vectorv1,Vectorv2){return(v1.x*v2.x+v1.y*v2.y+v1.z*v2.z);}voidmain(){floata[]={1,2,3};Vectorv1(a),v2(4,5,6),v3(7,8,9),v4,v5;v4=v1+v2;v4.show();v5=v3-v1;v5.show();cout<<"v1*v2="<<v1*v2<<endl;}【解析】定义向量类,并对各运算符进行重载。本程序采用友元函数重载“+”、“-”、“*”运算符,在此也可采用成员函数重载,从程序可读性考虑,一般认为双目运算符,重载为友元函数更好些。但重载“=”运算符必须用成员函数。【思考题】㈠选择题1.下面运算符中,不能重载的是______。A.?:B.+C.*D.<=【答案】???【提示】C++中不能被重载的运算符有“::”、“?:”、“.”、“.*”、“sizeof”2.下面运算符中,不能重载的是______。A.&&B.[]C.::D.new【答案】???3.关于运算符重载,下面描述中正确的是______。A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构【答案】???【提示】运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算的语法结构。4.友元重载运算符obl>ob2被C++编译器解释为______。A.operator>(obl,ob2)B.>(ob1,ob2)C.ob2.operator>(ob1)D.ob1.operator>(ob2)【答案】???【提示】友元函数重载运算符的调用形式:operator<运算符>(<参数1>,<参数2>)等价于表达式:<参数1><运算符><参数2>5.若a+b运算需通过成员函数实现“+”运算符重载,下面描述中正确的是______。A.a必须为该类对象,b可为其它数据类型B.a和b都必须为该类对象C.b必须为该类对象,a可为其它数据类型D.a和b均可为其它数据类型【答案】???【提示】成员函数实现a+b时,编译器解释为:a.operator(b),因此左操作数a必须为该类对象,否则无法实现成员函数的调用,而右操作数可以是该类的对象,也可以是其它数据类型。6.MA是一个类名,下面重载运算符的成员函数原型中不正确的是______。A.MAoperator-();B.MAoperator-(MA);C.MAoperator-(MA&);D.MAoperator-(MA,MA);【答案】???【提示】运算符“-”可以是单目运算符的“负”运算,也可以是双目运算符的“减”运算,因此成员函数实现时,可以不带参数(实现一元运算),也可以带一个参数(实现二元运算),但不可能是两个参数。7.有下面类定义,并在类外对“++”运算符重载函数进行定义,其中不正确的是______。classPoint{intx,y;public:Pointoperator++();};A.PointPoint::operator++(){x++;y++;return*this;}B.PointPoint::operator++(){x+=5;y+=5;return*this;}C.PointPoint::operator++(){x--;y--;return*this;}D.PointPoint::operator++(intn){x+=n;y+=n;return*this;}【答案】???【提示】函数定义时的参数声明必须与函数原型中的参数声明一致。答案D与函数原型中的参数不一致,所以是错误的。尽管在答案B和答案C中,函数的功能和实际理解的自增概念不一样,但函数定义是正确的,运算符重载本身就是给运算符重新定义功能。8.对list类进行逻辑运算符“==”重载,下面重载函数声明中正确的是______。A.list&list::operator==(constlist&a);B.listlist::operator==(constlist&a);C.bool&list::operator==(constlist&a);D.boollist::operator==(constlist&a);【答案】???9.有下面类定义,若主函数中有定义:funm,c,d;则执行语句c=++m;编译器将其中的++m解释为______。classfun{public:funoperator+=(fun);friendfunoperator++(fun&);};A.c.operator++(m);B.m=operator++(m);C.m.operator++(m);D.operator++(m);【答案】???10.在上题中,若执行语句d+=m;编译器将其解释为______。A.d=operator+=(m);B.m=operator+=(d);C.d.operator+=(m);D.m.operator+=(d);【答案】???11.有下面类定义,若类外执行语句a=b+c;编译器将其中的b+c解释为:operator+(b,c);则下面描述中正确的是______。classCom{……friendComoperator+(……);};A.a、b、c都必须是Com的对象。B.a、b都必须是Com的对象。C.a必须是Com的对象,而b和c中只要有一个是Com的对象即可。D.b、c都必须是Com的对象。【答案】???㈡填空题1.双目运算符重载为类的成员函数时,其左操作数必须是______,而右操作数可以是______。【提示】将双目运算符重载为类的成员函数时,由于this指针在非静态成员函数操作对象时都作为第一个隐式参数传递了对象,它充当了双目运算符的左操作数,而该成员函数的形参则表示双目运算符的右操作数。因此左操作数必须是该类的对象,而右操作数可以是类型与形参类型兼容的数据。2.运算符重载必须保持其原来的优先级、______、______。【提示】运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性、运算符的语法结构。3.运算符“+”重载后,若希望该运算符满足交换性,可将其重载为______。【提示】①成员函数重载时,其左操作数必须是类的对象,如果右操作数是一个其它数据类型,就不可以实现交换。②友元函数重载时,只需要两个操作数中,其中一个是类的对象,这两个操作数都作为参数,所以可满足运算符“+”的可交换性。即执行sl+s2和s2+sl的结果是相同的,从而满足运算符“+”的交换性。4.运算符重载一种是通过成员函数来实现,另一种是通过______来实现。5.当用成员函数重载双目运算符时,运算符的左操作数必定是______。㈢改写程序题1.复数类Complex,将运算符“+”以成员函数形式重载,实现两复数相加。试采用友元函数改写该程序中的运算符重载函数。#include<iostream.h>classComplex{floatreal,image;public:Complex(floatr=0,floati=0):real(r),image(i){}Complexoperator+(Complex&c){returnComplex(real+c.real,image+c.image);}voidshow(){if(image>=0)cout<<real<<'+'<<image<<'i'<<endl;elsecout<<real<<'-'<<(-image)<<'i'<<endl;}};voidmain(){Complexc1(1,2),c2(-3,-4),c3;c3=c1+c2;c3.show();}改写程序如下:【答案】???㈣编程题1.编写程序:存放在myComplex.cpp文件中,包含内容如下:①定义复数类Complex。私有成员数据有:存放实部、虚部值的real、image。公有成员函数有:可设置复数实部、虚部值的成员函数voidset(floatr=0,floati=0);可按“3+5i”(或”3-5i”)格式输出复数的成员函数voidshow();构造函数Complex(floatr=0,floati=0)。②用成员函数方式重载运算符:“前置++”、“后置++”、“前置--”、“后置--”,实现复数的增量和减量运算。③用友元函数方式重载运算符:“+”、“-”、“+=”、“-=”,“==”、“!=”,实现复数的双目运算。④编写main()函数去测试Complex类。编写程序如下:【答案】???2.编写程序:改写第1题,要求如下:◆将第1题中的②改用友元函数方式重载运算符:“前置++”、“后置++”、“前置--”、“后置--”,实现复数的增量和减量运算。◆将第1题中的③改用成员函数方式重载运算符:“+”、“-”、“+=”、“-=”,“==”、“!=”,实现复数的双目运算。编写程序如下:【答案】???3.编写程序:存放在myStudent.cpp文件中,包含内容如下:①定义学生类Student。私有成员数据有:存放学号、姓名、成绩值的id、name、score。公有成员函数有:可设置学生值的成员函数voidset(inti=0,char*na=””,ints=0);可按“学号=04081111姓名=张小笑成绩=99”格式输出的成员函数voidshow();构造函数Student(inti=0,char*na=””,ints=0)。②用友元函数方式重载关系运算符:大于“>”、小于“<”,实现两个学生的比较运算,学生之间的比较按其成绩比较,“成绩高的学生”大于“成绩低的学生”。friendbooloperator>(Student&s1,Student&s2);friendbooloperator<(Student&s1,Student&s2);③用友元函数方式重载运算符:提取“>>”、插入“<<”,实现学生数据的整体输入和输出。friendistream&operator>>(istream&in,Student&s);friendostream&operator<<(ostream&out,Student&s);④编写main()函数:定义学生数组Student[6],实现学生数据的键盘输入、降序排序、并将排序后的学生数据输出到显示器、文件(Student.txt)中各1份。编写程序如下:【答案】???4.编写程序:㈠自定义一个字符串类mystring,其声明部分存放在mystring.h头文件中,其成员函数的实现部分存放在mystring.cpp文件中,定义内容如下:★成员数据:①chars[N];用于存放字符串的数组容器,其中N为常量②intsize;数组中最多可容纳的元素数,size=N③intlast;数组中已用元素的最大下标,空串时last=0★成员函数:①构造函数:mystring();mystring(char*);mystring(mystring&);//可省略不写②析构函数:~mystring();//可省略不写③成员重载运算符:mystringoperator+(mystring&);mystringoperator+(char*);mystring&operator+=(mystring&);mystring&operator+=(char*);mystringoperator=(mystring&);//可省略不写mystring&operator=(char*);booloperator<(mystring&);booloperator<(char*);booloperator==(mystring&);booloperator==(char*);char&operator[](int);④友元重载运算符:istream&operator>>(istream&,mystring&);ostream&operator<<(ostream&,mystring&);㈡编写main()函数对字符串类mystring进行测试。编写程序如下:【答案】???4.(选做)编写程序:存放在myBirth.cpp文件中,包含内容如下:①定义生日类Birth。私有成员数据有:存放年、月、日值的year、month、day。公有成员函数有:可设置生日的成员函数voidset(inty=0,intm=0,intd=0);可按“生日=1990/12/06”格式输出生日的成员函数voidshowBirth();可按“年龄=20”格式输出年龄的成员函数voidshowAge();构造函数Birth(inty=0,intm=0,intd=0);构造函数Birth(char*s),其参数值为以“yyyy/mm/dd”形式给出的字符串。②定义类型转换成员函数operatorint();将生日数据转换为整型数据年龄。③用友元函数重载运算符“>”、“<”、“==”,实现两个生日之间的比较运算。如:表达式Birth("2002/10/01")>Birth("2001/01/10"),表示2002年10月1日在2001年1月10日之后;表达式Birth("2005/10/01)==Birth(5,10,1),表示两个生日是同一天。④编写main()函数去测试Birth类。【提示】◆库函数time()原型:longtime(long*t);功能:提取当前时间,即从1970/01/01的00:00:00开始到当前的秒数,返回该值,并存放到长整型变量t中。注意:使用该函数需包含<time.h>/<ctime>头文件。◆库函数ctime()原型:char*ctime(constlong*t);功能:将长整型变量t中以秒计的时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论