版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 1第第9章章 友元函数与运算符重载友元函数与运算符重载 2 29.1 友元函数友元函数9.2 运算符重载概述运算符重载概述 9.3 一元运算符重载一元运算符重载9.4 二元运算符重载二元运算符重载3 39.1 友元函数友元函数v为了强调类的数据封装性,常将一些关键成员设为私有访问为了强调类的数据封装性,常将一些关键成员设为私有访问特性特性-为什么引入友元?为什么引入友元?v友元可以是一个函数,该函数被称为友元可以是一个函数,该函数被称为友元函数友元函数;友元可以是;友元可以是一个类,该类被称为一个类,该类被称为友元类友元类。v友元函数是一种普通函数,不是类的成员函数,说明时在函友元函数是一
2、种普通函数,不是类的成员函数,说明时在函数前面加以关键字数前面加以关键字friend,它可以象成员函数一样不受限制,它可以象成员函数一样不受限制地访问该类的任何成员。地访问该类的任何成员。 4 4友元函数的定义格式:友元函数的定义格式:(1)类中定义)类中定义friend 类型类型 函数名(函数名( 形参形参 ) 函数体函数体 (2)类中说明,类外定义)类中说明,类外定义类中原型说明:类中原型说明:friend 类型类型 函数名(形参);函数名(形参);类外定义:类外定义:类型类型 函数名(形参)函数名(形参) 函数体函数体 5【例例9-1】求圆柱体的体积。求圆柱体的体积。 #includec
3、onst float PI=3.1415 ;class A float r,h; public: A(float a,float b)r=a;h=b; friend float v1(A &); /友元函数友元函数v1的原型说明的原型说明float v2( ) return PI*r*r*h; /定义成员函数定义成员函数v2float getr()return r; float geth()return h;友元函数的形参为友元函数的形参为类的对象的引用类的对象的引用6float v1(A &a) /友元函数友元函数v2在类体外的定义在类体外的定义 return PI*a.r*
4、a.r*a.h;float v3(A b) /全局函数全局函数 return PI*b.getr()*b.getr()*b.geth();void main() A a1(25,40);A a2(25,40); coutv1(a1)“n”; /调用友元函数调用友元函数v1cout a2.v2( )“n”; /调用成员函数调用成员函数v2cout”。13(3)不能用成员函数重载的运算符)不能用成员函数重载的运算符 插入运算符插入运算符“”。(4)运算符重载不能改变运算符的优先级、操作数)运算符重载不能改变运算符的优先级、操作数 的个数和结合性等基本性质。的个数和结合性等基本性质。(5)重载运算符
5、限制在)重载运算符限制在C+中已有的运算符范围内,中已有的运算符范围内, 不能创建新的运算符。不能创建新的运算符。14【例例9-2】负号运算符重载。负号运算符重载。#include class Com float real,image; public: Com(float r=0,float i=0) real=r; image=i; Com operator-( ); void print() coutreal=realnimage=imageendl; ;15Com Com:operator-() Com t; t.real=-real; /At.image=-image; /B retu
6、rn t;void main() Com c1(25,50),c2; c2=-c1; /编译器解释为编译器解释为c1.operator-();c1.print();c2.print();169.3 一元运算符重载一元运算符重载 C+中允许重载的一元运算符有中允许重载的一元运算符有: 自增运算符自增运算符“+”、自减运算符、自减运算符“-”、 负号运算符负号运算符“-”、逻辑非运算符、逻辑非运算符“!”等。等。 179.3.1 用成员函数重载一元运算符用成员函数重载一元运算符用成员函数重载用成员函数重载“+”运算符的格式为:运算符的格式为:(1)+为前缀形式为前缀形式函数类型函数类型 opera
7、tor+(void) 函数体函数体(2)+为后缀形式为后缀形式函数类型函数类型 operator+(int) 函数体函数体 重载自减运算符重载自减运算符“-”的格式与重载的格式与重载“+”运算符类似。运算符类似。 18【例例9-3】自增运算符的重载。自增运算符的重载。#include class Aint m,n;public:A(int x=0,int y=0) m=x; n=y; A operator+( )/成员函数重载前置成员函数重载前置+,类中定义,类中定义+m; +n; /Areturn *this; /B A operator+(int);/成员函数重载后置成员函数重载后置+,类
8、中说明,类外定义,类中说明,类外定义void print( ) coutm=mtn=nn; ; 19A A:operator+(int) A t=*this; /C+m; +n; /也可以调用已定义的前置也可以调用已定义的前置+重载函数,写成重载函数,写成+(*this);return t;void main( )A a1(1,2),a2(10,20),a3,a4;a3=+a1;/Da4=a2+;couta1:t;a1.print( );couta3:t;a3.print( );couta2:t;a2.print( );couta4:t;a4.print( );编译器解释为编译器解释为a1.o
9、perator+(); 程序解读:程序解读: 前置和后置的实现方法:前置和后置的实现方法:v通过函数的重载区别,后置通过函数的重载区别,后置增加一个整型参数。增加一个整型参数。v前置时,数据成员直接自增前置时,数据成员直接自增或自减,然后返回变化后的对或自减,然后返回变化后的对象;后置时,先保存自增或自象;后置时,先保存自增或自减前的对象,然后再进行自增减前的对象,然后再进行自增或自减,最后返回变化前的对或自减,最后返回变化前的对象。象。v为了区别自增和自减运算符为了区别自增和自减运算符的前置和后置,在重载后置运的前置和后置,在重载后置运算符时,增加一个形式参数算符时,增加一个形式参数“int
10、”,由于该参数无论是在,由于该参数无论是在重载函数的定义中,还是在重重载函数的定义中,还是在重载函数的调用中均不涉及,所载函数的调用中均不涉及,所以可以只列出其类型而不给出以可以只列出其类型而不给出名称。名称。209.3.2 用友元函数重载一元运算符用友元函数重载一元运算符 用友元函数重载运算符,其函数名仍然是关键字用友元函数重载运算符,其函数名仍然是关键字operator加上所要重载的运算符。重载一元运算符时,由于友元函数加上所要重载的运算符。重载一元运算符时,由于友元函数不同于成员函数,没有不同于成员函数,没有this指针,所以重载函数用一个对象指针,所以重载函数用一个对象作为形参,通过实
11、参和形参的结合,完成对对象的操作。作为形参,通过实参和形参的结合,完成对对象的操作。 21【例例9-4】自减运算符的重载。自减运算符的重载。#include class Aint m,n;public:A(int x=0,int y=0) m=x; n=y; friend A operator-(A &t)/友元函数重载前置友元函数重载前置-,类中定义,类中定义 -t.m; -t.n; return t; friend A operator-(A &t, int); )/友元函数重载后置友元函数重载后置-,类中说明,类中说明void print( ) coutm=mtn=nn;
12、 ; 22A operator-(A &t,int)A temp=t; /A-t.m; -t.n; /Breturn temp;void main( )A a1(1,2),a2(10,20),a3,a4;a3=-a1;/Ca4=a2-;couta1:t;a1.print( );couta3:t;a3.print( );couta2:t;a2.print( );couta4:t;a4.print( );编译器解释为编译器解释为operator-(a1);23v用成员函数重载一元运算符时,因为用成员函数重载一元运算符时,因为this指针的存在指针的存在,重载函数的参数个数为,重载函数的参数
13、个数为0。当前哪个对象调用该运算。当前哪个对象调用该运算符重载函数,就是对该对象的操作。符重载函数,就是对该对象的操作。v用友元函数重载一元运算符时,由于友元函数没有用友元函数重载一元运算符时,由于友元函数没有this指针,重载函数的参数个数为指针,重载函数的参数个数为1。被操作的对象作。被操作的对象作为实参传递给重载函数的形参。形参一般为对象或对为实参传递给重载函数的形参。形参一般为对象或对象的引用。象的引用。249.4 二元运算符重载二元运算符重载 C+中允许重载的二元运算符有:中允许重载的二元运算符有: 赋值运算符、复合的赋值运算符、赋值运算符、复合的赋值运算符、 关系运算符、逻辑运算符
14、等。关系运算符、逻辑运算符等。 259.4.1 用成员函数重载二元运算符用成员函数重载二元运算符 用成员函数重载二元运算符时,运算符的左操用成员函数重载二元运算符时,运算符的左操作数一定是对象,因为要将其作为当前对象,调用作数一定是对象,因为要将其作为当前对象,调用重载函数。右操作数作为重载函数的实参,可以是重载函数。右操作数作为重载函数的实参,可以是对象、对象的引用,也可以是其它数据类型,如整对象、对象的引用,也可以是其它数据类型,如整型、实型。成员函数重载二元运算符,重载函数的型、实型。成员函数重载二元运算符,重载函数的参数个数为参数个数为1个。个。26【例例9-6】加法运算符和复合的赋值
15、运算符的重载。加法运算符和复合的赋值运算符的重载。#include class Aint a,b,c;public:A(int x=0,int y=0,int z=0) a=x; b=y; c=z; A operator+(A t) A temp=*this; /Atemp.a+=t.a; temp.b+=t.b; temp.c+=t.c; return temp; /B27A operator+(int); void operator+=(A t) a+=t.a;b+=t.b; c+=t.c; void print( ) coutatb; couttcn; ; A A:operator+(i
16、nt s) A temp=*this;temp.a+=s; temp.b=b; temp.c=c; return temp;void main( )A a1(1,2,3),a2(4,5,6),a3,a4;a3=a1+a2; a4=a2+100; a1+=a3; a3.print( );a4.print( );a1.print( );编译器解释为编译器解释为a1.operator+(a2); 编译器解释为编译器解释为a2.operator+(100); 289.4.2 用友元函数重载二元运算符用友元函数重载二元运算符 用友元函数重载二元运算符时,重载函数的参数用友元函数重载二元运算符时,重载函数
17、的参数 个数为个数为2,运算符的两个操作数都作为函数的实参。,运算符的两个操作数都作为函数的实参。 其中一个操作数是对象或对象的引用。其中一个操作数是对象或对象的引用。29【例例9-8】加法运算符和复合的赋值运算符的重载。加法运算符和复合的赋值运算符的重载。#include class A int a,b,c; public: A(int x=0 , int y=0 , int z=0) a=x; b=y; c=z; friend void operator+=(A &t1, A t2); friend A operator+(A t1 , A t2 ); void print( )
18、coutatbt; coutcn; ; 30void operator+=(A &t1 , A t2) t1.a+=t2.a; t1.b+=t2.b; t1.c+=t2.c; A operator+(A t1 , A t2 ) A t; t.a=t1.a+t2.a; t.b=t1.b+t2.b; t.c=t1.c+t2.c; return t; void main( ) A a1 , a2(1,2,3) , a3; a1.print( ); a3=a1+a2; a3.print( ); a3+=a2; a3.print( ); 编译器解释为编译器解释为operator+(a1,a2); 编译器解释为编译器解释为operator+=(a3,a2);31练习练习1:下面关于运算符重载的描述错误的是(下面关于运算符重载的描述错误的是( )。)。A. 运算符重载不能改变操作数的个数、运算符的优先级、结合运算符重载不能改变操作数的个数、运算符的优先级、结合性和运算符的语法结构性和运算符的语法结构B. 不是所有的运算符都可以进行重载不是所有的运算符都可以进行重载C. 运
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁石油化工大学《建筑给水排水工程》2023-2024学年第一学期期末试卷
- 兰州博文科技学院《大众健身操》2023-2024学年第一学期期末试卷
- 吉林司法警官职业学院《焊接先进技术》2023-2024学年第一学期期末试卷
- 湖南大学《数字媒体设计与制作-U交互设计》2023-2024学年第一学期期末试卷
- 【物理】《物体的浮沉条件及应用》(教学设计)-2024-2025学年人教版(2024)初中物理八年级下册
- 重庆海联职业技术学院《中学生物教学研究与实践》2023-2024学年第一学期期末试卷
- 郑州电子信息职业技术学院《材料分析测试技术(B)》2023-2024学年第一学期期末试卷
- 浙江科技学院《装饰图案设计》2023-2024学年第一学期期末试卷
- 中国青年政治学院《金融社会工作》2023-2024学年第一学期期末试卷
- 郑州轻工业大学《染整工艺实验(2)》2023-2024学年第一学期期末试卷
- 2024年大学英语四级真题CET及答案解析
- 网安民警个人工作总结
- 黄金买卖合同范本
- 米-伊林《十万个为什么》阅读练习+答案
- 碎屑岩油藏注水水质指标及分析方法
- 【S洲际酒店婚礼策划方案设计6800字(论文)】
- 医养康养园项目商业计划书
- 《穿越迷宫》课件
- 《C语言从入门到精通》培训教程课件
- 2023年中国半导体行业薪酬及股权激励白皮书
- 2024年Minitab全面培训教程
评论
0/150
提交评论