




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主讲人:曹宣俊C+C+面向对象程序面向对象程序设计设计第1页/共51页2021-12-5目录 指针与引用比较 函数重载函数指针 链表 面向对象设计思想 类和对象第2页/共51页指针与引用比较 指针与引用都是间接引用其他对象。 首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。 第3页/共51页指针与引用比较 char *pc = 0;
2、 / 设置指针为空值char& rc = *pc; / 让引用指向空值这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生)。 第4页/共51页指针与引用比较 引用必须初始化string& rs; / 错误,引用必须被初始化string s(xyzzy);string& rs = s; / 正确,rs指向s指针没有这样的限制。string *ps; / 未初始化的指针/ 合法但危险第5页/共51页指针与引用比较 不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。void p
3、rintDouble(const double& rd)cout rd; / 不需要测试rd,它 / 肯定指向一个double值相反,指针则应该总是被测试,防止其为空:void printDouble(const double *pd)if (pd) / 检查是否为NULLcout *pd;第6页/共51页指针与引用比较 指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。string s1(Nancy);string s2(Clancy);string& rs = s1; / rs 引用 s1stri
4、ng *ps = &s1; / ps 指向 s1rs = s2; / rs 仍旧引用s1,/ 但是 s1的值现在是/ Clancyps = &s2; / ps 现在指向 s2;/ s1 没有改变第7页/共51页指针与引用比较 总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符。这个操作符典
5、型的用法是返回一个目标对象,其能被赋值。vector v(10); / 建立整形向量(vector),大小为10;v5 = 10; / 这个被赋值的目标对象就是操作符返回的值如果操作符返回一个指针,那么后一个语句就得这样写:*v5 = 10; 但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针 第8页/共51页函数类别 内部函数和外部函数内部函数:内部函数时是在定义它的文件中可以被调用的函数,而在同一程序的其他文件中不可调用
6、,定义内部函数的格式如下:static 类型说明 函数名(参数表)函数体; 第9页/共51页函数类别 外部函数: 外部函数是作用域在整个程序中的函数,包含组成该程序的若干个文件。外部函数的定义格式如下: extern 类型说明 函数名(参数表)第10页/共51页函数重载 所谓重载就是赋给同一个函数名不同的含义。 具体的讲,c+中允许在相同的作用域内以相同的名字定义几个不同实现的函数,可以是类成员函数,也可以是普通的函数。但是,定义重载函数时要求同名函数的参数至少有一个类型不同,或者个数不同,否则会造成二义性。而对返回值没有要求。第11页/共51页函数指针 定义方式数据类型 (*函数名)(参数列
7、表);应用(小学生四则混合运算综合程序设计):要求:一张试卷包含十道题目题目随机产生考生做完后可以查看得分 int add(int left,int right)return left+right; int sub(int left,int right) return left+right; 第12页/共51页函数指针 int multiply(int left,int right) return left*right; int divide(int left,int right) if(right = 0)return -1;return left/right; 第13页/共51页函数指针
8、struct Topic int left;char op;int right;int result;int key;bool flag; ; struct Paper int num;Topic* topics;char name15;int score; ;第14页/共51页函数指针Paper* createPaper(char* name)Paper* paper=new Paper;strcpy(paper-name,name);paper-topics=new Topic10;paper-num = 10;char op4=+,-,*,/;for(int i=0;itopicsi.l
9、eft=left;paper-topicsi.right=right;paper-topicsi.op=opwhichop;return paper;第15页/共51页函数指针int getResult(int left,int right,char op)int (*fun)(int,int);switch(op)case +:fun=add;break;case -:fun=sub;break;case *:fun=multiply;break;case /:fun=divide;break;default:break;return fun(left,right);第16页/共51页函数指
10、针void testSystem()cout*小学生四则混合运算;cout*endl;char name15=0;coutname;Paper* paper=createPaper(name);int count=0;for(int i=0;inum;+i)int result; couttopicsi.lefttopicsi.optopicsi.rightresult; paper-topicsi.result = result;paper-topicsi.key=getResult(paper-topicsi.left,paper-topicsi.right,paper-topicsi.o
11、p);if(result = paper-topicsi.key) paper-topicsi.flag=true; +count; else paper-topicsi.flag=false; paper-score = count*100/paper-num;cout恭喜您得了score分data = a0;head-next=NULL;link* tmp=head;for(int i=1;idata = ai;newnode-next = NULL;tmp-next=newnode;tmp=newnode;return head; 第21页/共51页单向链表的实现 void print(
12、link* head) while(head != NULL)coutdatanext; void main() link* head=createSingleLink();print(head); 第22页/共51页双向表 双向链表结点定义 struct linkint data;/数据域link* prev;/指针域link* next;/指针域;第23页/共51页双向表 应用举例:有15个人围成一圈,轮流按1,2,3报数,报到3的人退出圈子。下一个人报1,问最后一个人是谁?第24页/共51页双向表 #define N 15 int a15=1,2,3,4,5,6,7,8,9,10,11,
13、12,13,14,15; char ch15=a,b,c,d,e,f,g,h,i,j,k,l,m,n,o; struct linkint data;/数据域link* prev;/指针域link* next;/指针域;第25页/共51页双向表link* createDleLink()link* head=new link;head-prev=head-next=NULL;head-data=a0;link* tmp=head;for(int i=1;idata=ai;newnode-next=NULL;newnode-prev=tmp;tmp-next=newnode;tmp=newnode;
14、tmp-next = head;head-prev=tmp;return head;第26页/共51页int getLast(link* phead)int count=N;int step=3;int seq=1;link* head=phead;while(count1)if(seq = step)link* tmp=head-next;head-prev-next=head-next;head-next-prev=head-prev;delete head;head=tmp;seq=1;-count;elsehead=head-next;+seq;return head-data;第27
15、页/共51页双向表 void app() link* head=createDleLink();coutchgetLast(head)endl; void main() app(); 第28页/共51页面向对象程序设计思想 从现实世界中客观存在的事物(对象)出发来构造系统,并在系统构造中尽可能地运用人类的自然思维方式。第29页/共51页以面向对象思想构造软件系统的主要内容 1、对象是以面向对象方法构造的系统的基 本单位。对象是对问题域中客观存在的事物的抽象。2、对象的属性和操作组成一个完整的对象, 对象具有一定的对外接口,外界对象可以通过该接口来访问对象。3、以对象为基础,对对象分类,将具有共
16、同特性的对象进行抽象,形成对这些对象的抽象描述类,每个对象就是该类的一个实例。第30页/共51页4、对形成的对象类进一步抽象,抽出这些类的共同特征,形成基本的类和派生的类,派生的类又可以具有更多的派生类,这样就形成一个类簇。基本类和派生类的关系称为继承。5、一个系统就是由各个对象组成,对象和 对象之间存在静态关系和动态关系。 静态关系体现了对象之间固有的关系; 动态关系是对象之间通过发送消息进行 通信,相互协作,完成系统功能。第31页/共51页面向对象程序方法面向对象方法是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。第32页/共51页面向对象方法的
17、形成1、面向对象程序设计语言的三阶段发生发展成熟第33页/共51页面向对象方法的形成2、Smalltalk语言 Smalltalk是第一个完善的、实用的纯面向对象的语言。它有三个特点:(1)将任何东西都看成对象,包括类本身。对对象的方法的调用在Smalltalk中称为发送消息给对象。第34页/共51页Smalltalk语言(2)不进行任何类型检查操作,强调多态性和动态连接。(3) Smalltalk不仅是一种语言,它还是一个具有类库支持和交互式图形拥护界面的完整的程序设计环境。第35页/共51页面向对象程序设计语言的分类(1)纯粹的面向对象程序设计语言 完全依照面向对象思想而设计的,它的所有语
18、言成分都以对象为核心。 如:Smalltalk、Eiffel、Actor和JAVA等第36页/共51页面向对象程序设计语言的分类(2)混合的面向对象程序设计语言 在某种已经被广泛使用的其他语言的基础上增加了支持面向对象思想的语言成分。 如:Object C、C+、Object Pascal、和 CLOS等第37页/共51页类和对象 类的定义格式class 类名public:成员函数或数据成员的说明;private:数据成员或成员的说明;第38页/共51页类和对象 公有成员:可以被程序中任何代码访问;私有的成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生类的成员函数
19、都不能访问他们:保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类成员也可以访问。第39页/共51页举例 class Aprivate:int i;protected:int j;public:int k;int geti()return i;int getj()return j;int getk()return k; 第40页/共51页 下面是访问类A的对象a中数据成员的各种情况:A a;/定义类A的对象aa.i;/非法,i为A的私有成员a.j;/非法,j为A的保护成员a.k;/合法,k为A的公有成员本例的所有成员函数都是在类体中。若在
20、类体外实现。若在类体外实现,需要使用作用域运算符:,用它来标识某个成员函数是属于哪个类的。该运算符在这里使用的格式如下:类名:函数名(参数表)int A:geti()return i;第41页/共51页对象普通对象定义在定义了一个类以后,定义其对象的一般格式如下:类名 对象名表;对象指针定义类名* 对象指针名表;A a1,a2,*p;第42页/共51页对象数组 对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义,赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对象。 类名 数组名大小Sample Array5;第43页/共51
21、页构造函数和析构函数构造函数构造函数功能:在创建对象时使用给定的值将对象初始化。构造函数的特点:(1)构造函数是成员函数,函数体可放在类体内,也可放在类体外。(2)构造函数是一个特殊的函数,该函数的名字与类名相同,且不指定类型说明,它有隐含的返回值,该值由系统内部使用。该函数可以有一个参数,也可以有多个参数第44页/共51页构造函数和析构函数(3)构造函数可以重载,即可以定义多个参数不同的函数。(4)程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。 和一般成员函数类似,类的构造函数可以带有参数,也可以重载,构造函数的重载表示类对象的不同的初始化方式。不带任何参数的构造函数为默认构造函数。第45页/共51页示例程序一 class Sample int n;public:Sample()n=0;Sample(int i)n=i;void disp()cout“n=”nendl; ; void main()Sample s1,s2(10);s1.disp();s2.disp(); 第46页/共5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风湿免疫科护生复习试题含答案
- 黑龙江省大庆市2025年中考数学真题(含答案)
- 2025年军检心理测试题库及答案
- 2025合同金额项目年度支付明细表
- 2025城市住宅用地转让合同
- 透析室护理安全隐患
- 西药二试题及答案
- 行测考试题型真题及答案
- 美容宣传知识培训方案课件
- 新增灯光考试题及答案大全
- 村级妇联半年工作总结
- 职业健康:放射卫生知识培训计划
- 数控安全培训课件
- 台球俱乐部工作管理制度
- 肉毒素中毒的治疗讲课件
- 蓝色简约风医学生职业生涯规划展示模板
- 土建安全员c类考试试题及答案
- 第四版(2025)国际压力性损伤溃疡预防和治疗临床指南解读
- 职业学校化妆课教案
- 《泡泡玛特营销策略问卷调查及消费者RFM分析案例综述》2000字
- DB32T 4772-2024自然资源基础调查技术规程
评论
0/150
提交评论