C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++4

上传人:E**** 文档编号:89343178 上传时间:2019-05-23 格式:PPT 页数:35 大小:194KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++4_第1页
第1页 / 共35页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++4_第2页
第2页 / 共35页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++4_第3页
第3页 / 共35页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++4_第4页
第4页 / 共35页
C++面向对象程序设计 教学课件 ppt 作者  朱战立 张玉祥 C++4_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++4》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++4(35页珍藏版)》请在金锄头文库上搜索。

1、第四章 友元和运算符重载,掌握: 友元的概念、设计方法; 运算符重载为成员函数的方法; 运算符重载为友元函数的方法;,友元的基本概念,类似与现实世界,给朋友以更大的分享权利 优点:给设计人员提供了便利性 缺点:使面向对象软件的封装性有了一些漏洞 分类 友元类 类B定义类A是自己的朋友,则A是B的友元类。类A中的所有成员函数都可以访问类B的所有成员。 友元函数 类B定义某个函数是自己的友元,称该函数是类B的友元函数。该函数可以访问类B的所有成员 友元成员函数 类B定义类A的某个成员函数是自己的友元,称该函数是类B的友元成员函数。该函数可以访问类B的所有成员,友元类,定义类A是类B的友元类: cl

2、ass B friend class A; /定义友元类 (类B的常规定义) ; 可以放在类B的任意位置,通常放在类定义的首部 要求类A在程序中有定义 友元类不能传递,不能继承,不具有相互性,例 41 友元类设计,#include class B friend class A; private: int topSecret; public: B(int t = 0):topSecret(t) int GetTopSecret(void) return topSecret; ;,class A public: A(void) A(void) void change(B ,友元函数,定义函数f (

3、)是类A的友元函数 class A friend ; (类A的常规定义) 函数f()是定义在类A外的一个函数。 如果函数需要频繁访问类A的私有成员,可以将该函数定义成类A的友元函数,#include class Complex friend Complex Add ( Complex first, Complex second); friend void Print( Complex com); private: float real; float imag; public: Complex( float re = 0, float im = 0): real(re), imag(im) Co

4、mplex(void) ;,Complex Add( Complex first, Complex second ) return Complex( first.real +second.real, first.imagsecond.imag ); void Print( Complex com) cout “(“ com.real “, “ com.imag “)“ ; void main(void) Complex com1(3, 10), com2(6, 8), com3; com3 = Add(com1, com2); Print(com3); ,友元成员函数,类A的成员函数f()是类

5、B的友元成员函数。 class B friend ; (类B的常规定义) ; 可以用定义友元类的方法代替 不常用,运算符重载,特点:运算符使用方便。如x+y C+语言规定: 重载的运算符要保持原运算符的意义。 只能对已有的运算符重载,不能增加新的运算符。 重载的运算符不会改变原先的优先级和结合性。 运算符重载的形式 成员函数 友元函数 允许重载的运算符 (见教材93页),运算符重载为成员函数,成员函数 operater(形参列表) 例:复数加 Complex operater+(const Complex /则程序中可有这样的表达式 编译系统内部表示 .operater(实际参数) 例:A.o

6、perater+(B),例-2 设计一个复数类,复数运算包括加、减、乘、除、赋值、加赋值、判等和打印,要求复数运算重载为类的成员函数形式的运算符,并要求对所设计的类进行测试。,#include enum BoolerTRUE, FALSE; class Complex private: double real; double image; public: Complex(void):real(0), image(0); Complex(double rp):real(rp), image(0); Complex(double rp, double ip):real(rp), image(ip)

7、; Complex(); Complex operator+(const Complex ,Complex operator-(const Complex ,inline Complex Complex:operator+(const Complex ,inline Complex Complex:operator/(const Complex ,inline Booler Complex:operator=(const Complex ,void main(void) Complex a(3, 5), b(2, 3), c; c = a + b; c.Print(); c = a - b;

8、c.Print(); c = a * b; c.Print(); c = a / b; c.Print(); /调用objectX+objectY a += b; a.Print(); /相当于objectX.operator+(objectY) ,运算符重载为友元函数,友元函数 operater(形参列表) 例:复数加 Complex operater+(const Complex /则程序中可有这样的表达式 编译系统内部表示 operater(对象A, 实际参数) 例:operater+(A,B),例43 问题同例42。要求重载为友元函数,#include enum BoolerTRUE,

9、 FALSE; class Complex friend Complex operator+(const Complex ,public: Complex(void):real(0), image(0); Complex(double rp):real(rp), image(0); Complex(double rp, double ip):real(rp), image(ip); Complex(); void Print(void) const; ; void Complex:Print(void) const cout “(“ real “,“ image “i)“ endl; inli

10、ne Complex operator+(const Complex ,inline Complex operator-(const Complex ,void main(void) Complex a(3, 5), b(2, 3), c; c = a + b; c.Print(); c = a - b; c.Print(); c = a * b; c.Print(); c = a / b; c.Print(); a += b; a.Print(); ,两种重载方法的比较,加法语句2.3+a 重载为成员函数,系统内表示形式为: 2.3.operator+(a) /编译出错 重载为友元函数,系统

11、内表示为: operator+(2.3, a) 加法语句 a+2.3 重载为成员函数,系统内表示形式为: a.operator+(2.3) 重载为友元函数,系统内表示为: operator+(a, 2.3),运算符重载的几点准则,对大多数双目运算符来说,重载为友元函数比重载为成员函数适应性更强。 赋值运算符应重载为成员函数。 单目运算符,双目运算符和等,一般重载为成员函数。 运算符“()”为函数调用运算符,运算符“ ”为数组下标运算符,应重载为成员函数。,设计举例数组类设计,设计一个数组类,满足如下要求: 可自定义下界下标和上界下标; 可对下标越界进行检查; 可重置数组大小; 可获取数组的长度

12、; 数组类的对象可以使用赋值运算符()和下标运算符( )。,/Array.h #include #include Class Array private int size; int low; int up; double *arr; public: Array(int sz=100); Array(int l,int u); Array(const Array ,void operator=(const Array ,Array:Array(int l, int u) low=l; up=u; size=up-low+1; arr=new doublesize; Array:Array(con

13、st Array ,void Array:operater=(const Array return arrndx-low ,void Array:Resize(int sz) if(sz=0) exit(0); if(sz=size) return; double* newArray=new doublesz; int n=(sz=size)?sz:size; double* soucePtr=arr; double* destPtr=newArray; while(n-) *destPtr+=*soucePtr+; delete arr; arr=newArray; low=0; up=si

14、ze-1; size=sz; ,void Array:Resize(int ll,int hh) int sz=hh-ll+1; double* newArray=new doublesz; int n=(sz=size)?sz;size; double * soucePtr=arr; double* destPtr=newArray; while(n-) *destPtr+=*soucePtr+; delete arr; arr=newArray; low=ll; up=hh; size=sz; Int Array:ArraySize(void)const return size; ,/测试

15、主函数 / Array.cpp #include”Array.h” /包含Array.h void main(void) Array a(-5,5); cout“ArraySize=“ a.ArraySize() endl; for(int i=-5; i5: i+) ai=I; / a21=21; 数组越界出错 a.Resize(30); /重定义数组为30 a21=21; /正确 cout ”ArraySizeofResize=“ a.ArraySize() endl; ,设计举例字符串类设计,设计要求 该字符串类能和C+的字符串兼容使用,并要求重载运算符(=)、(=!)、()、(=)、(+)、(+=)。 设计分析 数据成员:字符数组首地址指针str, 字符串个数size,数组最后一个字符是结束标记0 成员函数:操作数可以是String类,也可以是C+字符串。,/String.h #include #include #include class String private: char *str; /字符数组的首地址 int size; /字符串的个数 public: S

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号