




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1面向对象程序设计与C+第七章 重载教 师: 王 涛 电 话: 51688243办公室: 九教北512E-mail: 21 函数重载 函数重载: 同一个域中,两个以上的函数可以取相同的名字,只要参数表不同即可。 在C语言中: int nplus(int, int);/ 整数相加 double dplus(double, double);/ 实数相加 float fplus(float, float);/ 浮点数相加 char* cplus(char*, char*);/ 字符串相加3函数重载 在C+中,可以利用函数重载使功能相同但参数表不同的函数使用相同的名字. 在C+语言中: int plu
2、s(int, int);/ 整数相加 double plus(double, double);/ 实数相加 float plus(float, float);/ 浮点数相加 char* plus(char*, char*);/ 字符串相加 示例程序:07_01 注意函数重载与参数类型转换的区别4函数重载 例程07_01的错误:指针指针动态存储区object windows str1str2 修改为 char str1=“ojbect “,str2=“windows”;windowsobject str2str1635.424.5y2x2windowsobject str2str1windows
3、 24.5y2x2plus(str1, str2)之后:5函数重载 重载的函数决定调用哪一个函数是在编译时根据参数表决定的.实际上是把它们编译成了不同名的函数。编译好的函数名类似于(各编译器可能不同):int _plus_int_int (int, int);float _plus_float_float (float, float);double _plus_double_double (double, double);6构造函数重载 类的构造函数可以有多个,其实是构造函数的重载,根据创建对象时的参数决定调用哪个一个构造函数。 类的析构函数的参数表必须为空,因此析构函数不能重载。class
4、Aint _value;public: A() _value = 0;A(int value) _value = value;/ ok. A() A(int value)/ error;7类成员函数重载 类成员函数重载的原则与普通外部函数及类构造函数一样,参数表不同即可. 不同类的成员函数名可相同(参数表也可相同),这种情况不是重载,因为他们属于不同的类域。 示例程序07_02(计时器程序)82 操作符重载class complex / 复数double real;/ 实数double virt; / 虚数/* */ ;complex c1, c2, sum; 若想实现:sum = c1 +
5、c2 ?sum.real = c1.real + c2.real;sum.virt = c1.virt + c2.virt;9方法一:通过定义存取函数存取函数class complexdouble real, virt;public: void setReal(double val) real = val; void setVirt(double val) virt = val; double getReal() return real; double getVirt() return virt; ;complex c1, c2, sum;sum.setReal( c1.getReal() +
6、 c2.getReal() );sum.setVirt ( c1.getVirt() + c2.getVirt() );10增加接口 方法二: 增加复制及加法接口class complexdouble real, virt;public: void Copy(complex& c)/ 复制数据real = c.real; virt = c.virt; void Add(complex& c) / 加法接口real += c.real;virt += c.virt; ;complex c1, c2, sum;sum.Copy( c1);sum.Add( c2 );11操作符重载
7、方法三:重载操作符,让对象支持=,+操作.class complexdouble real, virt;public: void operator = (const complex& c)real = c.real; virt = c.virt; complex operator + ( complex& c) complex val;val.real = thisreal + c.real;val.virt = thisvirt + c.virt;return val; ;complex c1, c2, sum;sum = c1 + c2; 示例程序07_0312操作符重载
8、C+中大多数操作符都能被重载,不能被重载的操作符有:. (取成员操作符) : (域操作符) * (解引用操作符) ? : (三元表达式) sizeof (计算对象大小) # (宏定义,预编译) 重载运算符时: 不能改变运算符的优先级 不能改变运算符所需操作数的数目132.1 成员函数重载操作符 在类定义体中声明运算符函数:type operator 运算符 (参数表 ) 用成员函数重载重载运算符,当前对象是该运算符的第一个操作数: 一元操作符,参数表为空(如+,-) 二元操作符,参数表中有一个操作数(如+,-,*,/)14 重载操作符的参数类型及返回值类型可以与对象类型不同.成员函数重载操作符
9、class Aint val;public: int operator + (int n)return val + n; ;main()A a1, a2; int n;n = a1 + 10;/ okn = 10 + a1;/ error, 系统缺省 + 不支持n = a1 + a2;/ error, 参数类型不正确15 同一个操作符可以被重载多次,只要参数表不同(不能是:参数表相同而返回值类型不同).成员函数重载操作符 示例程序07_04. +,-操作符的重载与+,-,*,/等操作符重载类似,不同的是它们是一元操作符,参数表中没有操作数.162.2 用友元重载运算符 除了用类的成员重载运算符
10、外,还可以用类的友元重载运算符:friend type operator 操作符(参数表); 友元重载运算符与类成员函数重载运算符的区别: 友元是外部函数,没有this指针,不能把当前对象作为第一个操作数 友元重载操作符的参数数目等于操作符所需的操作数数目17class point int x, y;public:point(int vx, int vy)x = vx; y =vy;point operator + (point pt);friend point operator (point p1, point p2);point point:operator + (point p)poin
11、t tp;tp.x = thisx + p.x; tp.y = thisy + p.y;return tp; point operator - (point p1, point p2)point tp;tp.x = p1.x - p2.x ; tp.y = p1.y - p2.y;return tp; point a(10, 10), b(20, 5), c(0, 0);c = a + b; c = a b;用友元重载运算符18 使用普通外部函数也可以重载运算符,不同在于它不能访问类的私有成员. 如果使用成员函数,友元,普通外部函数重载了相同的操作符(操作数及类型都相同),会产生“二义性”。
12、示例程序07_05.用友元重载运算符19 =(赋值运算符)也可以重载,但是只能采用成员函数重载. 一般情况下,系统会为每个类生成一个缺省的赋值运算符,实现成员内容赋值. 缺省重载的赋值运算符形式:A:operator = (const A&);A a1, a2;a1 = a2;等同于: memcpy (&a1, &a2, sizeof(A); 示例程序: 07_06=的重载20=的重载s1.contentss2.contentsnjtunjtus1.contentss2.contentsnjtunjtus1=s2:未显式重载=的情况:s1.contentss2.cont
13、entsnjtunjtus1.contentss2.contents已释放s1=s2:显式重载=的情况:新内存21 若class或struct成员中无指针成员,可以不显式重载=运算符,使用系统缺省重载的=运算符. 若class或struct成员中包含非静态指针成员,必须显示重载=运算符,重新分配内存并进行内容复制. 重载的=运算符最好使用引用参数,而不应该使用指针参数或对象实参.=重载的建议22和()的重载 (下标运算符)和()(函数调用符)也可以重载,但是只能采用成员函数重载. 一般需通过修改对象成员,则应该返回引用类型。 示例程序07_07.(重载示例)23new和delete重载 程序员如果需要自己管理内存分配,可以重载new和delete操作符.对象1对象2对象n系统缺省分配:对象1 对象2对象n程序员管理分配: new和delete的重载方式有两种: 覆盖缺省定义的全局方式(一般采用这一种) 针对某一个类的局部方式24和的重载 可以为自定义类型(struct或class)重载运算符“”,实现自定义类型的输入输出. 自定义数据类型对“”不能使用成员函数重载.ostr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络直播平台用户数据安全保护与管理协议
- 创新驱动海外矿产投资项目实施与监管合同
- 《医学理论与实践》投稿须知(官方认证)
- 江苏名校2025届高三第三次调查研究考试物理试题理试题含解析
- 吉林省普通高中联合体2024-2025学年高三月考试题(二)生物试题试卷含解析
- 医疗产品购销合同
- 化学工业分析基础试题库
- 群文阅读总结模版
- 2023年教育基础知识试题库及答案
- 译林版三年级起点五年级下册《Grammar Fun time》教学设计
- 宿迁市宿城区项里社区治理存在的问题及对策研究
- 阿司匹林的研究进展
- 装配钳工(中级)试题库
- 养老护理员职业技能等级认定三级(高级工)理论知识考核试卷
- 餐饮业消防安全管理制度
- 研发费用加计扣除政策执行指引(1.0版)
- GB/T 20647.9-2006社区服务指南第9部分:物业服务
- 海洋油气开发生产简介课件
- 重庆十八梯介绍(改)课件
- 一级病原微生物实验室危害评估报告
- 起重吊装作业审批表
评论
0/150
提交评论