已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
8.1面向对象程序设计方法概述8.2类的声明和对象的定义8.3类的成员函数8.4对象成员的引用8.5类的封装性和信息隐蔽8.6类和对象的简单应用举例,第8章类和对象的特性,8.1面向对象程序设计(OOP)方法概述,传统的面向过程的程序设计方法是围绕功能进行的,用一个函数实现一个功能。当程序规模大、数据很多、数据结构复杂、功能种类繁多时,程序设计者会难以应付。面向对象的程序设计的设计思路是围绕数据对象进行的,先将数据和对数据的操作封装成一个个对象,然后调用各个对象完成所需的任务。对大型程序设计来说,面向对象程序设计的方法十分有效,能大大降低程序设计者的工作难度,减少出错的机会。OOP的最重要的特性:抽象-将一个个同类的个体抽象成一个“类”如:张三、李四等具体的人抽象出“人”的概念封装和数据隐藏将数据和对数据的操作代码封装在一个对象中,形成一个基本单位。对象中的数据可以对外部隐蔽。,8.1面向对象程序设计(OOP)方法概述,继承一个新类可以利用已有的类的基础上建立起来,该新类是已有类(叫基类)的派生类。派生类中含有基类的数据和操作,即继承了基类的内容。可重用代码利用派生类继承机制,可以重用已有软件的大部分代码。从已有软件的类中派生出新类,新类可使用基类的代码。这样可减少编程工作量。多态性利用派生类继承机制,各个派生类既有基类的共同特性,又有各个派生类自己新增的特性。,例:设计求圆的周长和面积的程序。面向过程-首先想的是处理方法(过程):输入圆的半径计算面积;计算周长;显示相关的计算结果,面向过程和面向对象的编程,例:设计求圆的周长和面积的程序。面向过程:要输入圆的半径;=在main函数中输入计算面积;=调用一个函数计算面积;计算周长;=调用一个函数计算周长;显示相关的计算结果;=在main函数中输出结果,面向过程的编程,面向过程方法:求圆的面积,/计算圆的面积和周长#includeusingnamespacestd;constfloatpi=3.1415;floatarea(float);/函数原型声明floatgirth(float);/函数原型声明intmain()floatr;coutr;coutradius=rendl;coutgirth=girth(r)endl;coutarea=area(r)endl;return0;,/定义求周长函数floatgirth(floatr)return(2*pi*r);/定义求面积函数floatarea(floatr)return(pi*r*r);,面向过程,首先考虑遵循的步骤;然后才考虑如何表示这些数据;可能提供一个菜单选择是输入还是计算还是输出。,面向对象,设计有关圆的程序,跟踪的对象是圆首先考虑的是数据:圆的半径;不仅要考虑如何表示数据,还要考虑如何使用数据;因此要有一个“类”表示圆的各个方面:表示圆的数据:半径一些处理该数据的方法:首先要有获得“圆”信息的方法;其次,要有关于“圆”的各种计算方法,如:周长、面积等。另外还需要一些更新和显示“圆”信息的方法。,#includeclassCircledoubleradius;public:voidSet_Radius(doubler)radius=r;doubleGet_Radius()returnradius;doubleGet_Girth()return2*3.14f*radius;doubleGet_Area()return3.14f*radius*radius;intmain()CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return0;,1.1.2一个简单的C+程序,1.1概述,用面向对象的方法编程,#includeclassCircledoubleradius;public:voidSet_Radius(doubler)radius=r;doubleGet_Radius()returnradius;doubleGet_Girth()return2*3.14*radius;doubleGet_Area()return3.14*radius*radius;intmain()CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return0;,Circle类声明,1.1.2一个简单的C+程序,1.1概述,用面向对象的方法编程,#includeclassCircledoubleradius;public:voidSet_Radius(doubler)radius=r;doubleGet_Radius()returnradius;doubleGet_Girth()return2*3.14*radius;doubleGet_Area()return3.14*radius*radius;intmain()CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return0;,数据成员:圆的半径,1.1.2一个简单的C+程序,1.1概述,用面向对象的方法编程,#includeclassCircledoubleradius;public:voidSet_Radius(doubler)radius=r;doubleGet_Radius()returnradius;doubleGet_Girth()return2*3.14*radius;doubleGet_Area()return3.14*radius*radius;intmain()CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return0;,成员函数:对圆的操作,1.1.2一个简单的C+程序,1.1概述,用面向对象的方法编程,#includeclassCircledoubleradius;public:voidSet_Radius(doubler)radius=r;doubleGet_Radius()returnradius;doubleGet_Girth()return2*3.14*radius;doubleGet_Area()return3.14*radius*radius;intmain()CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return0;,建立对象(类类型变量),1.1.2一个简单的C+程序,1.1概述,用面向对象的方法编程,#includeclassCircledoubleradius;public:voidSet_Radius(doubler)radius=r;doubleGet_Radius()returnradius;doubleGet_Girth()return2*3.14*radius;doubleGet_Area()return3.14*radius*radius;intmain()CircleA,B;A.Set_Radius(6.23);coutA.Radius=A.Get_Radius()endl;coutA.Girth=A.Get_Girth()endl;coutA.Area=A.Get_Area()endl;B.Set_Radius(10.5);coutB.radius=B.Get_Radius()endl;coutB.Girth=B.Get_Girth()endl;coutB.Area=B.Get_Area()endl;return0;,1.1.2一个简单的C+程序,1.1概述,通过对象调用类的成员函数,用面向对象的方法编程,8.2类的声明和对象的定义,8.2.1类和对象的关系类-相当于类型,是具体对象的抽象。类不占用内存空间。对象-是类的具体实例。是属于“类”类型的变量。对象是占用内存空间的。,8.2.2声明类类型,举例说明:#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,为便于识别类,一般可约定将类名首字母大写,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,classTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,类声明,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,classTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,关键字定义一个类,标识符类名,class,struct都可以定义一个类:class缺省说明时,其成员被认为是私有的struct若不特别指出,其所有成员都是公有的,类声明的关键字,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,a,Tdate类的一个对象(实例),8.2.3定义对象的方法,先声明类类型,然后再定义对象如:先定义了Student类类型再定义属于Student类的对象stu;classStudent.;Studentstu;,2.在声明类类型的同时定义对象如:定义Student类类型的同时定义属于Student类的对象stu;classStudent.stu;3.在声明类类型时不要类名,并同时定义对象如:class.stu;,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,类由成员构成:数据成员描述对象的属性成员函数描述对象的方法(行为),8.3类的成员函数,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,数据成员,数据成员,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,类中定义成员函数,直接在类中定义成员函数代码,#includeclassTdatepublic:voidSet(intm,intd,inty);intIsLeapYear();voidPrint()private:intmonth;intday;intyear;voidTdate:Set(intm,intd,inty)month=m;day=d;year=y;intTdate:IsLeapYear()return(year%4=0,在类外定义成员函数,:作用域限定符类中声明函数,类外定义代码,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,成员的性质由关键字public、protected、private决定public公有公有段的成员是提供给外部的接口protected保护保护段成员在该类和它的派生类中可见private私有私有段成员仅在类中可见各段中既可以包含数据成员,也可以包含成员函数,成员访问限定符,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,类说明的一般形式为:class类名public:公有段数据成员和成员函数;protected:保护段数据成员和成员函数;private:私有数据成员和成员函数;,类声明的一般形式,例学生类的定义,classStudentpublic:voiddisplay()/公有的成员函数coutnum:numendl;coutname:nameendl;coutsex:sexendl;private:intnum;/私有的数据成员stringname;charsex;,在类内定义成员函数,例学生类的定义,classStudentpublic:voiddisplay();/公有的成员函数private:intnum;/私有的数据成员stringname;charsex;voidStudent:display()coutnum:numendl;coutname:nameendl;coutsex:sexendl;,在类内声明成员函数,在类外定义成员函数,#includeclassTdatepublic:voidSet(intm,intd,inty)month=m;day=d;year=y;intIsLeapYear()return(year%4=0,8.3.4成员函数的存储方式,属于同一类的不同对象a,b,c中的数据成员的值是不同的,而同一类的不同对象a,b,c的成员函数的代码是相同的。如:a.month,b.month,c.month是不同的数据a.Set(),b.Set(),c.Set()三个函数使用的数据分别是a,b,c中的数据,但函数代码是公用的。,8.3.4成员函数的存储方式,classStudent/声明类类型public:intnum;charname20;floatscore;voiddisplay()coutnum:numendl;coutname:nameendl;coutsex:sexendl;Studentstud1,stud2;/定义了两个Student类的对象,Student类的练习,数据成员在对象中占用内存空间;成员函数不占用对象的存储空间。,8.4对象成员的使用,成员运算符“.”stud1.numstud1.scorestud1.display();stud2.display();指针p=,成员运算符,classStudentpublic:intnum;charname20;floatscore;voiddisplay()coutnum:numendl;coutname:nameendl;coutscorescorename,zhangsan);p-score=89.5;p-display();return0;,引用,intmain()Studentstu1;Student,公有的还是私有的,classStudentpublic:=private:/私有成员intnum;charname20;floatscore;voiddisplay()coutnum:numendl;coutname:nameendl;coutscorescoreendl;intmain()Studentstud1;/定义Student类的对象stud1.num=1001;/stud1.num是私有成员,不能在类外使用strcpy(,“zhangsan”);stud1.score=89;stud1.display();return0;,公有的还是私有的,无论类成员是数据成员还是成员函数,都可以在类的公有部分或私有部分中声明它;但隐藏数据是OOP的主要目标之一,因此数据项通常放在私有部分;将作为类接口的成员函数放在公有部分,否则,就无法从程序中调用这些函数.,8.5类的封装性和信息隐蔽,8.5.1公有接口与私有实现的分离数据隐藏:让数据表示成为私有,使得数据只能被授权的函数访问;在声明一个类时,一般都是把所有的数据成员指定为私有的,使它们对外隔离。把需要让外界调用的成员函数指定为公用的。在类外虽然不能直接访问私有数据成员,但可以通过调用公用的成员函数来使用甚至修改私有数据成员。,数据隐藏,classStudentprivate:/私有成员数据intnum;charname20;floatscore;public:voiddisplay()coutnum:numendl;coutname:nameendl;coutscorescoreendl;intmain()Studentstud1;/定义Student类的对象stud1.num=1001;/非法,num是私有成员,不能再类外引用strcpy(,“zhangsan”);/非法stud1.score=89;/非法stud1.display();/合法return0;,类声明中增加input成员函数,classStudentprivate:/私有成员数据intnum;charname20;floatscore;public:/公有成员函数接口voiddisplay()coutnum:numendl;coutname:nameendl;coutscorescoreendl;voidinput(intno,char*nam,floats);voidStudent:input(intno,char*nam,floats)num=no;strcpy(name,nam);score=s;,使用类,intmain()Studentstu1;stu1.input(1001,zhangsan,89.5);stu1.display();return0;,创建一个程序,使用类对象,测试类的特性.,改进类声明,classStudentprivate:intnum;charname20;floatscore3;floataver;voidaverage();public:voiddisplay();voidinput(intn,char*p,floats);voidshow_aver();,数据:三门课成绩、平均分方法:求平均分、显示平均分,成员函数定义,voidStudent:input(intno,char*pnam,float*ps)num=no;strcpy(name,pnam);score0=ps0;score1=ps1;score2=ps2;voidStudent:display()coutnnum:numendl;coutname:nameendl;coutscore:score0score1score2endl;voidStudent:average()aver=(score0+score1+score2)/3;voidStudent:show_aver()average();coutnaverage=avernames0s1s2;stui.input(no,name,s);for(i=0;i10;i+)cout“第”i+1“个学生:”;stui.display();stui.show_aver();return0;,8.5.2类声明和成员函数定义的分离,在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率。为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。,将声明Student类安排在student.h文件,/student.h第1个文件classStudentprivate:intnum;charname20;floatscore3;floataver;voidaverage();public:voiddisplay();voidinput(intn,char*p,floats);voidshow_aver();,将定义Student类的成员函数安排在student.cpp文件,/student.cpp第2个文件#include#includestudent.h“usingnamespacestd;voidStudent:input(intno,char*pnam,float*ps)num=no;strcpy(name,pnam);score0=ps0;score1=ps1;score2=ps2;voidStudent:display()coutnnum:numendl;coutname:nameendl;coutscore:score0score1score2endl;voidStudent:average()aver=(score0+score1+score2)/3;voidStudent:show_aver()average();coutnaverage=avernames0s1s2;stui.input(no,name,s);for(i=0;i10;i+)cout“第”i+1t1.hour;/输入设定的时间cint1.minute;cint1.sec;coutt1.hour:t1.minute:t1.sechour;cinminute;cinsec;voidTimeshow_time()/在类外定义show_time函数couthour:minute:secarrayi;,voidArray_maxmax_value()/成员函数定义,找数组元素中的最大值inti;max=array0;for(i=1;imax)max=arrayi;voidArray_maxshow_value()/成员函数定义,输出最大值coutmax=max;intmain()Array_maxarrmax;/定义对象arrmaxarrmax.set_value();/调用arrmax的set_value函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市道路环境整治提升改造项目施工方案
- 消防安全技术实施与改进方案
- 巴中历届公务员考试试题及答案
- xx河段治理工程投资计划书
- 2026年蔬菜种植公司作业车辆维修与保养管理制度
- 2026年蔬菜种植公司蔬菜种植过程质量管控制度
- 2026年蔬菜种植公司绿禾内部控制制度审计管理制度
- 2025福建交通综合行政执法总队事业单位招聘拟聘人选易考易错模拟试题(共500题)试卷后附参考答案
- 钢网架结构施工方案
- 2025湖北黄石市商务局招聘政府雇员2人易考易错模拟试题(共500题)试卷后附参考答案
- GB/T 17554.1-2025卡及身份识别安全设备测试方法第1部分:一般特性
- GB/T 320-2025工业用合成盐酸
- Smith预估模糊PID控制算法及其应用
- 保安证考试新手必看试题及2025年答案
- 大数据时代财会领域数据资产与管理策略研究
- 【复习大串讲】【中职专用】高二语文上学期期末综合测试题(一)(职业模块)(原卷版)
- 绘画的力量知到智慧树章节测试课后答案2024年秋青海师范大学
- 抢救药品相关知识
- 《期中考总结班会》课件
- 医院运营管理工作汇报
- 部编人教版道德与法治九年级下册全册教案
评论
0/150
提交评论