版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、注意事项,运算符重载函数operator()可以返回任何类型,甚至可以使void类型,但通常返回类型与它所操作的类的类型相同,这样可使重载运算符用在复杂的表达式中。例如:复数的连续加、减。 在重载运算符时,运算符函数所作的操作不一定要保持C+中该运算符原有的含义,但这样容易造成混乱。所以保持原含义,容易被接受,也符合人们的习惯。,在C+中,用户不能定义新的运算符,只能从C+已有的运算符中选择一个恰当的运算符重载。 C+编译器根据参数的个数和类型来决定调用哪个重载函数。因此,可以为同一个运算符定义几个运算符重载函数来进行不同的操作。 运算符重载属于静态联编,友元运算符重载,在C+中,可以把运算符
2、函数定义成某个类的友元函数,称为友元运算符函数。 友元运算符函数在类的内部的声明格式: friend type operator(参数表); 定义格式: type operator(参数表) /函数体 ,与成元运算符不同,友元运算符函数是不属于任何类对象的,它没有this指针。 若重载的是双目运算符,则参数表中有两个操作数; 若重载的是单目运算符,则参数表中只有一个操作数 运算符重载为类的友元函数,就可以自由地访问该类的任何数据成员。这时,运算所需要的操作数都需要通过函数的形参来传递,在参数表中形参从左到右的顺序就是运算符操作数的顺序。,友元函数的双目运算符重载,对于双目运算符B,如果它的一个
3、操作数为A类的对象,就可以将B重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。 重载后的使用方式: aa bb; operator (aa,bb); 例子,#include class complex public: complex(double r=0.0,double i=0.0) real=r;imag=i; friend complex operator+(complex c1,complex c2); friend complex operator-(complex c1,complex c2); void display(); private: double re
4、al; double imag; ; void complex:display() coutreal.imagendl;,complex operator+(complex c1,complex c2) return complex(c2.real+c1.real,c2.imag+c1.imag); complex operator-(complex c1,complex c2) return complex(c1.real-c2.real,c1.imag-c2.imag); void main() complex c1(5,4),c2(2,10),c3; c1.display(); c2.d
5、isplay(); c3=c1+c2; c3.display(); c3=c1-c2; c3.display(); ,友元函数的单目运算符重载,对于前置单目运算符U,如果要实现表达式 U oprd,其中oprd为A类的对象,则U可以重载为A类的友元函数,函数的形参为A类的对象oprd。 对于后置单目运算符“+”和“”,如果要实现表达式oprd+或oprd-,其中oprd为A类的对象,那么运算符就可以重载为A类的友元函数,这时函数的形参有两个,一个是A类的对象oprd,另一个是整型(int)形参。,成员运算符函数与友元运算符函数的比较,对双目运算符而言,成员运算符函数带有一个参数,而友元运算符函
6、数带有两个参数;对单目运算符而言,成员运算符不带参数,而友元运算符函数带一个参数。 双目运算符一般可以被重载为友元运算符函数或成员运算符函数,但有些情况,必须使用友元函数。,nclass nclass:operator +(int x) nclass temp; temp.a=a+x; temp.b=b+x; return temp; nclass ob; ob=ob+100; ob=100+ob;(error,? 如何实现?),成员运算符函数和友元运算符都可以用习惯方式调用,也可以用他们专用的方式调用。,C+的大部分运算符即可说明为成员运算符,又可说明为友元运算符函数,究竟选择哪一种运算符函
7、数好一些,没有定论,这主要取决于实际情况和程序员的习惯。 一般而言,对于双目运算符,将它重载为一个友元运算符函数比重载为一个成员运算符函数便于使用。若一个运算符的操作需要修改类对象的状态,则选择成员运算符函数较好。如果运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则运算符重载必须有友元函数,而不能用成员函数。,赋值运算符“=”的重载,对任一类X,如果没有用户自定义的赋值运算符函数,那么系统将自动地为其生成一个缺省的赋值运算符函数,例如: X strcpy(ptr,s); string() delete ptr; void print() coutptrendl; private:
8、 char *ptr; ,string p1(“chen”); string p2=p1;,string ,类的赋值运算符“=”只能重载为成员函数,不能重载为友元函数。 类的赋值运算符“=”可以被重载,但重载了运算符函数operator =()不能被继承。,类型转换运算符,系统预定义类型间的转换 类型转换是将一种类型的值转换为另一种类型值。对于系统预定义的类型,C+提供两种类型转换,一种是隐式类型转换(标准类型转换),另一种是显式类型转换。 类类型与系统预定义类型间的转换 通过构造函数进行类型转换(p325) 通过类型转换函数进行类型转换,类类型转换函数可以用来把用户定义的类类型转换成基本类型
9、。他是一种类似显式类型转换的机制。在类中,类型转换函数定义的一般个市为: class X / operator type() / return type 类型的数据; / ;,转向的目标类型 (通常为基本类型),功能:将类X的对象转换 为类型为type的数据,class complex private: float real,imag; public: complex(float r=0,float i=0) real=r;imag=i; operator float() couttype changed to float.n; return real; operator int() couttype changed to int.n; return int(real); ;,注意事项,类型转换函数只能定义为一个类的成员函数而
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 脊髓疾病护理的未来发展趋势
- 心理慰藉志愿者服务协议书2026
- 垂直整合行业标准合作协议
- 会议设备租赁合同2026年度
- 2026年精益生产视角下的厂内物流改善
- 2026年如何处理团队中的“刺头”员工
- 2026社会及治理投资合作协议2026年
- 2026年初中生物后进生转化工作心得体会
- 线上医疗健康波特五力评估合同
- 咖啡机销售及售后服务合同
- 从“智人”到“数字人”
- DB11T 3032-2022 水利工程建设质量检测管理规范
- 媒体创意经济:玩转互联网时代学习通超星期末考试答案章节答案2024年
- 工程造价咨询服务投标方案(技术方案)
- GB/T 44299-2024探测器探测范围的测量方法和声明用于大和小运动探测的被动式红外探测器
- 《交通监控系统》课件
- 27.2.2相似三角形的性质教学设计人教版九年级数学下册
- GSTGM9000图形显示装置软件用户手册
- 明管结构计算书(Excel)
- 2023年同等学力申硕经济学综合历年真题及答案
- 《社会工作实务》初级社会工作师
评论
0/150
提交评论