版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、运算符重载【学习要点】1 理解多态性的概念和实现。 编译时多态性是通过函数重载、运算符重载实现的。 运行时多态性是通过类的继承 +虚函数实现的。2 掌握运算符重载的作用和规则。 在C+中可根据需要对运算符赋予多种含义,以配合用户自定义的类类型 运算符重载是通过定义运算符重载函数operator运算符(实现的。3 掌握双目、单目运算符重载为成员函数的方法。4 掌握双目、单目运算符重载为友元函数的方法。5 掌握重载为成员函数、重载为友元函数的区别: 友元函数与成员函数不同,它不是类的成员,没有this指针。 运算符=、()、卜一> 不能重载为友元函数,只能重载为成员函数。 运算符插入” &l
2、t;<、提取” >>'只能重载为友元函数。6掌握几个特殊运算符 “ +” -”、“ =”“”“<<” “>>的重载。7 掌握类型转换函数。&掌握自定义字符串类。9 掌握C+标准库中的string类的使用。【例题分析】1 下面程序中的错误有几处 ?#in eludeclass C int x , y ;public:C ( int a , int b : x( a , y( b C operator ( C a C temp ; temp.x=x+a.x ; temp.y=y+a.y ; return temp ; int operato
3、r# ( C a return ( x * y ; frie nd C operator= ( C a x=a.x ; y=b.y ; retur n *this ; void show( cout << "x=" << x <<"ty=" << y << endl ; ;void main( C a( 2,3 , b( 2,3 , c ;(a+b.show( ; c=a ; c.show(;【答案】3【解析】 函数C operator (C a ;运算符重载是允许用户重新定义运算符的含义,但此
4、运算符必须是C+系统预定义的,而”不是C+预定义的运算符,应换成 + ”。 函数int operator# (C a ;符号#不允许重载,应换成*”,另外形参C a也不需要。 函数friend C operator = (C a ; 赋值运算符="只能重载为成员函数,不能重载为友元函数,故将friend删去。其次,返回类型最好是C &。2 .编写程序:存放在 my Vector .cpp文件中,包含内容如下:定义向量类Vector。私有成员数据有:存放 向量在三条坐标轴上投影值的 x、y、z。 公有成员函数有:可设置 向量中x、y、z值的成员函数void set( float
5、 a=0, float b=0, float c=0 ;可输出向量中x、y、z值的成员函数 void show(;构造函数 Vector ( float a=0 , float b=0 , float c=0 ;构造函数Vector ( float v 3 ;两个赋值运算符 ="重载成员函数 Vector & operator=( Vector v 、Vector & operator=( float v 3 。将实现两个向量之间加、减、乘运算 的三个独立函数声明为 Vector类的友元函数:frie nd Vector operator+( Vector v1 ,
6、Vector v2 ;frie nd Vector operator-( Vector v1 , Vector v2 ;frie nd float operator*( Vector v1 , Vector v2 ; 编写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
7、*bx + ay *by + az *bz将运算符+ ”、“”、* ”和=”重载,实现向量间的加、减、乘、赋值运算。【答案】编写程序如下:#i nclude#i ncludeclass Vector float x , y ,乙public:Vector( float a=0 , float b=0 , float c=0 x=a ; y=b ; z=c ; Vector( float v 3 x=v0 ; y=v1 ; z=v2 ; void set( float a=0 , float b=0 , float c=0 x=a ; y=b ; z=c ; void show( cout &l
8、t;< x << 'i'cout << ( (y<0 ? '-' : '+' << fabs(y << 'j'cout << ( (z<0 ? '-' : '+' << fabs(z << 'k' << endl ; Vector & operator=( Vector v ;Vector & operator=( float v 3 ;friend Ve
9、ctor operator+( Vector v1 , Vector v2 ;friend Vector operator-( Vector v1 , Vector v2 ;friend float operator*( Vector v1 , Vector v2 ;;Vector & Vector: operator=( Vector v x=v.x ; y=v.y ; z=v.z ; return *this ; Vector & Vector: operator=( float v 3 x=v0 ; y=v1 ; z=v2 ; return *this ; Vector
10、operator+( Vector v1 , Vector v2 Vector temp ;temp.x=v1.x+v2.x ; temp.y=v1.y+v2.y ; temp.z=v1.z+v2.z ; return temp ; Vector operator-( Vector v1 , Vector v2 Vector temp ;temp.x=v1.x-v2.x ; temp.y=v1.y-v2.y ; temp.z=v1.z-v2.z ; return temp ; float operator*( Vector v1 , Vector v2 return ( v1.x*v2.x +
11、 v1.y*v2.y + v1.z*v2.z ; void main( float a = 1 , 2,3 ;Vector v1( 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 ;【解析】定义向量类,并对各运算符进行重载。本程序采用友元函数重载“ +” -”算符,在此也可采用成员函数重载,从程序可读性考虑,一般认为双目运算符,重载为友 元函数更好些。
12、但重载 “進算符必须用成员函数。【思考题】选择题1.下面运算符中,不能重载的是 。A. ?:B. +spanC . *D. <=【答案】?【提示】C+中不能被重载的运算符有 :“ ”、?: ”、.*”、Sizeof2 .下面运算符中,不能重载的 是 oA. &&B. C. :D. new【答案】?3 .关于运算符重载,下面描述中正确的是oA 运算符重载可以改变操作数的个数B .运算符重载可以改变优先级C. 运算符重载可以改变结合性D 运算符重载不可以改变语法结构【提示】运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算的 语法结构。4.友元重载运算符 o
13、bl>ob2被C+编译器解释为 。A operator>( obl , ob2B >(ob1 , ob2C ob2.operator>( ob1D ob1.operator>( ob2【答案】? ?【提示】友元函数重载运算符的调用形式:operatorv运算符 >( < 参数1> , <参数2>等价于表达式: < 参数1> <运算符 > < 参数2>5 若a+b运算需通过成员函数实现“ +运算符重载,下面描述中正确的是 。A a必须为该类对象,b可为其它数据类型B a和b都必须为该类对象C b必须为
14、该类对象,a可为其它数据类型D a和b均可为其它数据类型【答案】?【提示】成员函数实现a+b时,编译器解释为:a.operator(b ,因此左操作数a必须为该 类对象,否则无法实现成员函数的调用,而右操作数可以是该类的对象,也可以是其它数 据类型。6 MA是一个类名,下面重载运算符的成员函数原型 中不正确的是 。A MA operator-(;B MA operator-( MA ;C MA operator-( MA & ;D MA operator-( MA , MA ;【提示】运算符“”可以是单目运算符的 负”运算,也可以是双目运算符的 减”运算,因 此成员函数实现时,可以不带
15、参数 (实现一元运算,也可以带一个参数 (实现二元运算,但 不可能是两个参数。7 .有下面类定义,并在类外对“ +运算符重载函数进行定义,其中不正确的是 。class Point int x , y ;public:Point operator+(;;A . Point Point: operator+( x+ ; y+ ; return *this ; B. Point Point: operator+( x+=5 ; y+=5 ; return *this ; C. Point Point: operator+( x- ; y- ; return *this ; D. Point Poin
16、t: operator+( int n x+=n ; y+=n ; return *this ; 【答案】?【提示】函数定义时的参数声明必须与函数原型中的参数声明一致。答案D与函数原型中的参数不一致,所以是错误的。尽管在答案B和答案C中,函数的功能和实际理解的自增概念不一样,但函数定义是正确的,运算符重载本身就是给运算符重新定义功能。8对list类进行逻辑运算符“=重载,下面重载函数声明中正确的是 。A. list & list: operator=( const list &a ;B. list list: operator=( const list &a ;C. b
17、ool & list: operator=( const list &a ;D. bool list: operator=( const list &a ;【答案】?9.有下面类定义,若主函数中有定义:fun m , c , d ;则执行语句c=+m;编译器将其中的+m解释为。class fun public: fun operator+=( fun ;A. c.operator+( m ;B. m=operator+( m ;C . m.operator+( m ;D . operator+( m ;【答案】?10 .在上题中,若执行语句 d+=m;编译器将其解释为
18、。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 ;则下面描述中正确的是 。class Comfrie nd Com operator+( ; ;A. a、b、c都必须是 Com 的对象。B . a、b都必须是 Com的对象。C . a必须是Com的对象,而b和c中只要有一个是 Com的对象即可D . b、c都必须是 Com的对象。【答案】?填空题1 .双目运算符重载为
19、类的成员函数时,其左操作数必须是 ,而右操作数可以是【提示】将双目运算符重载为类的成员函数时,由于this指针在非静态成员函数操作对象时都作为第一个隐式参数传递了对象,它充当了双目运算符的左操作数,而该成员函数 的形参则表示双目运算符的右操作数。因此左操作数必须是该类的对象,而右操作数可以 是类型与形参类型兼容的数据。2 .运算符重载必须保持其原来的优先级、。【提示】运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性、运算符 的语法结构。3 .运算符“ +重载后,若希望该运算符满足交换性,可将其重载为 。【提示】 成员函数重载时,其左操作数必须是类的对象,如果右操作数是一个其它数据
20、类型,就 不可以实现交换。 友元函数重载时,只需要两个操作数中,其中一个是类的对象,这两个操作数都作为参数,所以可满足运算符 “ +”勺可交换性。即执行 sl+s2和s2+sl的结果是相同的,从而满 足运算符“ +”勺交换性。4 .运算符重载一种是通过成员函数来实现,另一种是通过 来实现。5 .当用成员函数重载双目运算符时,运算符的左操作数必定是 。改写程序题1 .复数类Complex,将运算符“ 以成员函数形式重载,实现两复数相加。试采用友元函 数改写该程序中的运算符重载函数。#i ncludeclass Complex float real , image ;public:Complex(
21、 float r=0 , float i=0 : real( r , image( i Complex operator+( Complex &c retur n Complex( real+c.real , image+c.image ; void show( if ( image >= 0 cout << real << '+' << image << 'i' << endl ;else cout << real << '-' <<
22、(-image << 'i' << endl ; ;void mai n( Complex c1( 1 , 2 , c2( -3 , -4 , c3 ;c3 = c1 + c2 ;c3.show(;改写程序如下:【答案】?编程题1.编写程序:存放在 myComplex.cpp文件中,包含内容如下: 定义复数类Complex。私有成员数据有:存放实部、虚部值的real、image。公有成员函数有:可设置复数实部、虚部值的成员函数void set( float r=0 , float i=0;可按 “3+5i ”(或” 3i ” 格式输出复数的成员函数 vo
23、id show(;构造函数 Complex ( float r=0 , float i=0。 用成员函数方式重载运算符:前置+”、后置+”、前置-”、后置-”,实现复数的增量和减量运算。 用友元函数方式重载运算符:“ +” -°、 “ +=” -=”,“ =' “!=”实现复数的双目运算。 编写main(函数去测试Complex类。编写程序如下:【答案】?2 .编写程序:改写第1题,要求如下:将第1题中的改用友元函数方式重载运算符:前置+”、后置+”、前置-”、后置-”,实现复数的增量和减量运算。将第1题中的改用成员函数方式重载运算符:“ +、-、 “ +='丄”,“
24、 =、“!=,”实现复数的双目运算。编写程序如下:【答案】?3. 编写程序:存放在 myStudent.cpp文件中,包含内容如下: 定义学生类Student。私有成员数据有:存放学号、姓名、成绩值的id、name、score。公有成员函数有:可设置学生值的成员函数void set( int i=0 , char *na =s=0 ;可按 学号=04081111姓名=张小笑成绩=99”格式输出的成员函数 void show(; 构造函数 Student ( int i=0 , char *na =” , int s=0 用友元函数方式重载关系运算符:大于>”、小于 <”,实现两个学
25、生的比较运算,学生之间的比较按其成绩比较,成绩高的学生”大于 成绩低的学生”。friend bool operator( Stude nt &s1 , Stude nt &s2 ;frie nd bool operator< ( Stude nt &s1 , Stude nt &s2 ; 用友元函数方式 重载运算符:提取 >> ”、插入 << ”,实现学生数据的整体输入和输出。friend istream & operator( istream &n , Student &s ;frie nd ostream
26、 & operator<< ( ostream & out , Stude nt &s ; 编写main(函数:定义学生数组 Student 6 ,实现学生数据的键盘输入、降序排序、并将排序后的学生数据输出到显示器、文件(Stude nt.txt )中各1份。编写程序如下:【答案】?4. 编写程序:自定义一个字符串类 mystri ng ,其声明部分存放在 mystri ng.h 头文件中,其成员函数 的实现部分存放在 mystri ng.cpp文件中,定义内容如下:成员数据: char s N ;用于存放字符串的数组容器,其中N为常量 int size ;
27、数组中最多可容纳的元素数,size = N int last ;数组中已用元素的最大下标,空串时last = 0成员函数: 构造函数:mystri ng (;mystri ng ( char * ;mystri ng ( mystri ng & ;可省略不写 析构函数:mystring ( ; /可省略不写 成员重载运算符:mystri ng operator + ( mystri ng & ;mystri ng operator + ( char * ;mystri ng & operator += ( mystri ng & ;mystri ng &
28、 operator += ( char * ;mystri ng operator = ( mystri ng & ;/ 可省略不写mystri ng & operator = ( char * ;bool operator < ( mystri ng & ;bool operator < ( char * ;bool operator = ( mystri ng & ;bool operator = ( char * ;char & operator ( int ; 友元重载运算符:istream & operator >&g
29、t; ( istream & , mystring & ;ostream & operator << ( ostream & , mystri ng & ;编写main(函数对字符串类mystring进行测试。编写程序如下:【答案】?4 .(选做)编写程序:存放在 myBirth.cpp文件中,包含内容如下:定义生日类Birth。私有成员数据有:存放年、月、日值的 year、month、day。公有成 员函数有:可设置生日的成员函数void set( int y=0 , int m=0 , int d=0; 可按 生日= 1990/12 /0
30、6 ”格式输出生日的成员函数void showBirth(;可按 年龄=20 ”格式输出年龄的成员函数 void showAge(;构造函数 Birth( int y=0 , int m=0 , int d=0;构造函数Birth( char *s ,其参数值为以“yyyy/mm/dd形式给出的字符串。 用友元函数重载运算符>”、 <”、=”,实现两个生日之间的比较运算。如:表达式Birth("2002/10/01" > Birth("2001/01/10" ,表示 2002 年 10 月 1 日在 2001 年 1 月 10 日之 后; 表达式Birth("2005/10/01 = Birth(5, 10, 1,表示两个生日是同一天。 编写main
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度钢房拆除与临时安置服务一体化合同2篇
- 面向小学生的网络安全意识和实践能力培养
- 2025版中小学生课后辅导中心安全协议书3篇
- 二零二五年度石材运输合同纠纷处理规则3篇
- 2025版无底薪健身器材销售代表合同3篇
- 二零二五年度绿色环保型工厂土地购置与转让协议3篇
- 二零二五年度办公大楼楼顶租赁及管理服务合同4篇
- 二零二五年度车辆煤炭运输车辆安全监控系统采购合同3篇
- 二零二五年度餐厅员工福利保障及社会保险缴纳合同3篇
- 2025年度店铺装修施工与售后服务保障合同范本
- 高性能建筑钢材的研发与应用
- 无线广播行业现状分析
- 汉语言沟通发展量表(长表)-词汇及手势(8-16月龄)
- 高速公路相关知识讲座
- 儿科关于抗生素使用的PDCA
- 商务服务业的市场细分和定位策略
- 财政学论文我国财政支出存在的问题及改革建议
- 小学生必备古诗
- 手术室护理实践指南2023年
- 移动商务内容运营(吴洪贵)任务六 结合热度事件的内容传播
- 新人教版六年级下册数学全册课件
评论
0/150
提交评论