- 1、本文档共49页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C的程序设计(谭浩强完整版)-运算符重载
* 对双目运算符,重载为成员函数时,仅一个参数,另一个被隐含;重载为友元函数时,有两个参数,没有隐含参数。 一般来说,单目运算符最好被重载为成员函数;对双目运算符最好被重载友元函数。 * 转换函数 转换函数就是在类中定义一个成员函数,其作用是将类转换为某种数据类型。 class A { float x, y; public: A(float a, float b){ x=a; y=b; } }; void main(void) { A a(2,3); coutaendl; } 错误!类的对象不能直接输出 利用转换函数将类A的对象a转换成某种数据类型 A float * A :: operator float ( ) { return x+y; } A float 格式为: ClassName :: operator type( ) {.........} 类名 具体的转换算法 欲转换类型 关键字 转换算法自己定义 1. 转换函数必须是类的成员函数。 2. 转换函数的调用是隐含的,没有参数。 * class A { int i; public:public: A(int a=0) { i=a; } void Show(void) { couti=iendl; } operator int( ){ return i; } }; void main(void) { A a1(10),a2(20); couta1endl; couta2endl; } * class Complex{ float Real,Image; public: Complex(float real=0,float image=0) { Real=real; Image=image; } void Show(void) {coutReal=Real\tImage=Imageendl; } operator float(); //成员函数,定义类转换 Complex-float }; Complex::operator float () { return Real*Real+Image*Image;} void main(void) { Complex c(10,20); c.Show (); coutcendl;//可以直接输出c,因为已经进行类型转换 } * 注意,转换函数只能是成员函数,不能是友元函数。转换函数的操作数是对象。转换函数可以被派生类继承,也可以被说明为虚函数。 * 赋值运算符与赋值运算符重载 “=” 同类型的对象间可以相互赋值,等同于对象的各个成员的一一赋值。 A a(2,3), b; b=a; 但当对象的成员中使用了动态的数据类型时(用new开辟空间),就不能直接相互赋值,否则在程序的执行期间会出现运行错误。 * class A{ char *ps; public: A( ){ ps=0;} A(char *s ){ ps =new char [strlen(s)+1]; strcpy(ps,s);} ~A( ){ if (ps) delete ps;} void Show(void) { coutpsendl;} }; void main(void ) { A s1(China!),s2(Computer!); s1.Show(); s2.Show(); s2=s1; s1.Show(); s2.Show(); } //相当于 s2.ps=s1.ps; s1 ps “China” s2 ps Computer s2.ps=s1.ps 首先析构s2 接着析构s1出错 * 这时,利用编译系统的默认赋值无法正确运行程序,必须重载赋值运算符“=”,即重新定义“=”。 格式为: 函数类型 ClassName::operator=(参数表) 赋值运算符必须重载为成员函数。 A A:: operator = (A a) 函数返回值类型 成员函数作用域 函数名 函数参数 b=a; b.operator=(a); 左操作符调用右操作符 * class Sample{ int x; public: Sample(int i=0){x=i;} void disp(void){ cout“x=“xendl;} void operator=(Sample p) { x=p.x; } }; void main(void) { Sample A(20),B; Sample C(A);//使用缺省的拷贝构造函数 B=A; //
您可能关注的文档
- axur的e教程.docx
- AX的D调试以及使用方法.ppt
- A型肉毒毒素局部的注射技术申报书.pdf
- Avantage_-_定量分析与的数据处理方法.pdf
- A的2O调试方案.doc
- AX的I4-协议规范.ppt
- Avaya视的频会议方案.pptx
- A的B_PLC_程序基础.ppt
- A的MBAAXI4协议.ppt
- a的ndroid进程间通信.ppt
- 农业食品的存储行业发展趋势研判及战略投资深度研究报告.docx
- 体育教学设计案例初中生.docx
- 农业碳汇经济相关行业公司成立方案及可行性研究报告.docx
- 安全生产月企业安全生产管理培训PPT教学课件.pptx
- 五子棋规则技巧文化介绍PPT教学课件.pptx
- 2025年湖北省十堰市高职单招职业技能考试模拟试题及答案解析.docx
- 2025年黑龙江艺术职业学院单招职业技能考试模拟试题及答案解析.docx
- 2025年河北省张家口市高职单招职业技能考试模拟试题及答案解析.docx
- 2025年河北省廊坊市高职单招职业技能考试题库及答案解析.docx
- 2025年河北省邢台市高职单招职业技能考试题库及答案解析.docx
文档评论(0)